462. 最少移动次数使数组元素相等 II
思路:
首先,考虑如果只有两个数字,a,b,且满足 a<=b时,使他们一致的最小差值是多少?
我们假设这个差值是f(a,b) , 如果让a,b最后变为c, 显然, 当c<a||c>b时,f(a,b)不是最优的,而当c取[a,b]中任意一个值的时候,f(a,b)的值不变, (f(a,b)=b-c+c-a=b-a)
现在考虑如果有很多个数字我们该怎么做, 如果我们可以找到一个数字x,并且用数组中的数字两两构造出一对[ai,bi],使得x包含于所有的[ai,bi]就好了,这样一定是最优解,不难发现,x就是数组的中位数,而[ai,bi]则分别是x两边的数字
我们先把数组排序
假设我们的数组长度是奇数,那么直接选最中间的数字作为x即可,反之数组长度是偶数,考虑数组[1,2,4,6], 发现,我们选取 [2,4]内任意一个数字对答案都没有影响(因为他们都满足包含于[ai,bi]这一条件),所以我们干脆取最左边的数字2了
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin(),nums.end());
int val=nums[nums.size()/2];
int ans=0;
for(auto it:nums) ans+=fabs(it-val);
return ans;
}
};