3107. 使数组中位数等于 K 的最少操作数
问题描述
给你一个整数数组 nums
和一个 非负 整数 k
。一次操作中,你可以选择任一元素 加 1
或者减 1
。
请你返回将 nums
中位数 变为 k
所需要的 最少 操作次数。
一个数组的中位数指的是数组按非递减顺序排序后最中间的元素。如果数组长度为偶数,我们选择中间两个数的较大值为中位数。
示例 1:
**输入:**nums = [2,5,6,8,5], k = 4
**输出:**2
**解释:**我们将 nums[1]
和 nums[4]
减 1
得到 [2, 4, 6, 8, 4]
。现在数组的中位数等于 k
。
示例 2:
**输入:**nums = [2,5,6,8,5], k = 7
**输出:**3
**解释:**我们将 nums[1]
增加 1 两次,并且将 nums[2]
增加 1 一次,得到 [2, 7, 7, 8, 5]
。
示例 3:
**输入:**nums = [1,2,3,4,5,6], k = 4
**输出:**0
**解释:**数组中位数已经等于 k
了。
提示:
1 <= nums.length <= 2 * 105
1 <= nums[i] <= 109
1 <= k <= 109
解题思路与代码实现
class Solution {
public long minOperationsToMakeMedianK(int[] nums, int k) {
Arrays.sort(nums); // 数组升序排序
int midIndex = nums.length/2; // 中位数下标,注意数组下标从0开始
int midNum = nums[midIndex]; // 中位数
long res = 0; // 记录操作次数
if(midNum > k){ // 当前数组中位数大于k,需要调整[0,midIndex]的数都小于等于k
for (int i = midIndex; i >= 0 && nums[i] > k; i--) {
res += (nums[i] - k);
}
}
if(midNum < k){ // 需要调整[midInde,n-1)的数都大于等于k
for (int i = midIndex; i < nums.length && nums[i] < k; i++) {
res += (k - nums[i]);
}
}
return res;
}
}
踩坑点
返回值res一开始下意识用int接收,溢出