给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。
在一步操作中,你可以使数组中的一个元素加 1 或者减 1 。
示例 1:
输入:nums = [1,2,3]
输出:2
解释:
只需要两步操作(每步操作指南使一个元素加 1 或减 1):
[1,2,3] => [2,2,3] => [2,2,2]
示例 2:
输入:nums = [1,10,2,9]
输出:16
提示:
n == nums.length
1 <= nums.length <= 105
-109 <= nums[i] <= 109
通过次数21,388提交次数34,608
题解:
参考 jam大神的方法,相当于找出规律了
当 数组长度为奇数的时候
【1 , 2 , 3】
res = 2-1 + 3-2 = 3-1 = 2
类似 i-1 + 3-i = 3-1 =2
当时 数组长度为偶数的时候
【1 , 4】
res = i-1 + 4-i = 4-1
因此 可看下面代码
Python代码暴力:
class Solution:
def minMoves2(self, nums: List[int]) -> int:
nums.sort()
n = len(nums)
if n==2: return nums[1]-nums[0]
if n==1 or n==0: return 0
ans = 0
res = 0
if n%2==0:
a = nums[n//2-1]
b = nums[(n+2)//2-1]
c = 0
for i in nums:
res += abs(a-i)
for j in nums:
c += abs(b-j)
return min(c , res)
else:
ans = nums[n//2]
for i in nums:
res += abs(ans-i)
return res
数学方法推导的C++代码:
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin() , nums.end());
int left=0 , res=0 , right = nums.size()-1;
while (left<right){
res += (nums[right]-nums[left]);
left++;
right--;
}
return res;
}
};
数学方法推导的python代码:
class Solution:
def minMoves2(self, nums: List[int]) -> int:
nums.sort()
res , left , right = 0 , 0 , len(nums)-1
while left<right:
res += nums[right]-nums[left]
left += 1
right -= 1
return res