📅  最后修改于: 2023-12-03 15:22:08.373000             🧑  作者: Mango
在本题中,我们有一个整数数组 nums,我们可以进行如下操作:
我们需要最少次操作才能使所有数组元素相等。请你返回将数组中所有元素变成相等元素所需的最小增量和减量。
首先,对于一个有序的数组,我们可以很容易地找到一个中位数 mid,使得所有元素最终都可以变成 mid。因为如果 k < mid,那么只要操作后的数字 >=mid,就可以使得该数可以通过操作变成 mid;如果 k > mid,那么只要操作后的数字 <= mid,就可以使得该数可以通过操作变成 mid。此时,使所有元素相等所需的最小操作数即为 sum(nums[i]-mid)。
那么对于一个无序的数组,我们可以先将其排序,然后找到其中位数。排序的时间复杂度为 O(nlogn),中位数的查找时间复杂度为 O(1),因此总时间复杂度为 O(nlogn)。
class Solution:
def minMoves2(self, nums: List[int]) -> int:
nums.sort()
mid = nums[len(nums)//2]
return sum(abs(num-mid) for num in nums)
class Solution {
public int minMoves2(int[] nums) {
Arrays.sort(nums);
int mid = nums[nums.length/2];
int sum = 0;
for(int num: nums){
sum += Math.abs(num-mid);
}
return sum;
}
}
以上是本题解题思路和代码实现,对于更多类似的算法题目,可以参考 LeetCode 网站。