Welcome to Subscribe On Youtube
3107. Minimum Operations to Make Median of Array Equal to K
Description
You are given an integer array nums
and a non-negative integer k
. In one operation, you can increase or decrease any element by 1.
Return the minimum number of operations needed to make the median of nums
equal to k
.
The median of an array is defined as the middle element of the array when it is sorted in non-decreasing order. If there are two choices for a median, the larger of the two values is taken.
Example 1:
Input: nums = [2,5,6,8,5], k = 4
Output: 2
Explanation:
We can subtract one from nums[1]
and nums[4]
to obtain [2, 4, 6, 8, 4]
. The median of the resulting array is equal to k
.
Example 2:
Input: nums = [2,5,6,8,5], k = 7
Output: 3
Explanation:
We can add one to nums[1]
twice and add one to nums[2]
once to obtain [2, 7, 7, 8, 5]
.
Example 3:
Input: nums = [1,2,3,4,5,6], k = 4
Output: 0
Explanation:
The median of the array is already equal to k
.
Constraints:
1 <= nums.length <= 2 * 105
1 <= nums[i] <= 109
1 <= k <= 109
Solutions
Solution 1: Greedy + Sorting
First, we sort the array $nums$ and find the position $m$ of the median. The initial number of operations we need is $|nums[m] - k|$.
Next, we discuss in two cases:
- If $nums[m] > k$, then all elements to the right of $m$ are greater than or equal to $k$. We only need to reduce the elements greater than $k$ on the left of $m$ to $k$.
- If $nums[m] \le k$, then all elements to the left of $m$ are less than or equal to $k$. We only need to increase the elements less than $k$ on the right of $m$ to $k$.
The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$. Here, $n$ is the length of the array $nums$.
-
class Solution { public long minOperationsToMakeMedianK(int[] nums, int k) { Arrays.sort(nums); int n = nums.length; int m = n >> 1; long ans = Math.abs(nums[m] - k); if (nums[m] > k) { for (int i = m - 1; i >= 0 && nums[i] > k; --i) { ans += nums[i] - k; } } else { for (int i = m + 1; i < n && nums[i] < k; ++i) { ans += k - nums[i]; } } return ans; } }
-
class Solution { public: long long minOperationsToMakeMedianK(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); int n = nums.size(); int m = n >> 1; long long ans = abs(nums[m] - k); if (nums[m] > k) { for (int i = m - 1; i >= 0 && nums[i] > k; --i) { ans += nums[i] - k; } } else { for (int i = m + 1; i < n && nums[i] < k; ++i) { ans += k - nums[i]; } } return ans; } };
-
class Solution: def minOperationsToMakeMedianK(self, nums: List[int], k: int) -> int: nums.sort() n = len(nums) m = n >> 1 ans = abs(nums[m] - k) if nums[m] > k: for i in range(m - 1, -1, -1): if nums[i] <= k: break ans += nums[i] - k else: for i in range(m + 1, n): if nums[i] >= k: break ans += k - nums[i] return ans
-
func minOperationsToMakeMedianK(nums []int, k int) (ans int64) { sort.Ints(nums) n := len(nums) m := n >> 1 ans = int64(abs(nums[m] - k)) if nums[m] > k { for i := m - 1; i >= 0 && nums[i] > k; i-- { ans += int64(nums[i] - k) } } else { for i := m + 1; i < n && nums[i] < k; i++ { ans += int64(k - nums[i]) } } return } func abs(x int) int { if x < 0 { return -x } return x }
-
function minOperationsToMakeMedianK(nums: number[], k: number): number { nums.sort((a, b) => a - b); const n = nums.length; const m = n >> 1; let ans = Math.abs(nums[m] - k); if (nums[m] > k) { for (let i = m - 1; i >= 0 && nums[i] > k; --i) { ans += nums[i] - k; } } else { for (let i = m + 1; i < n && nums[i] < k; ++i) { ans += k - nums[i]; } } return ans; }