给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。
例如:
输入:[1,2,3]
输出:2
说明:只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1):
[1,2,3] => [2,2,3] => [2,2,2]
思路:直觉是向中间靠拢。实际上是选中位数,如果元素个数一共是奇数个的话,那么选最中间的数,如果元素个数偶数的话,那么选中间两个数中的任意一个都可以,下面给出简单证明。假设一共有9个元素:a1, a2, a3, a4, a5, a6, a7, a8, a9
1、当选a5时,re5= (a7+a8+a9 +a6)-(a1+a2+a3+a4)
2、当选a4时,re4= (a7+a8+a9 +a6)-(a1+a2+a3+a4) + a5-a4>re5
re4=(a7+ a8+a9)-(a1+a2+a3) + (a6-a4) + (a5-a4)
3、当选a3时,re3= (a7+ a8+a9)-(a1+a2+a3) + (a6-a3) + (a5-a3) +(a4-a3) > re4
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin(), nums.end());
int re=0, mid=nums[nums.size()/2];
for(auto x:nums){
re+=abs(x-mid);
}
return re;
}
};