给你一个长度为 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