leetcode Minimum Moves to Equal问题
邮局问题,找到中位数即可
为什么要找中位数?
可以首位两两配对,发现可以转换到数轴上,要想要绝对值最小,就是让点取到数轴上两点之间。当每组配对都是取到两点之间即可,容易看出中位数满足这个条件(不管是奇数个数还是偶数个数)
代码用到STL库中nth_element函数
nth_element(a,a+k,a+n),函数只是把下标为k的元素放在了正确位置,对其它元素并没有排序,当然k左边元素都小于等于它,右边元素都大于等于它,所以可以利用这个函数快速定位某个元素。
那求第k大时呢?我们可以转化成求第n-k+1小,此时下标应该是n - k。
代码如下
class Solution {
public:
int minMoves2(vector<int>& nums) {
int n = nums.size();
nth_element(num.begin(),nums.begin()+ n /2 ,nums.end());
int x = nums[n / 2];
int res = 0;
for(auto y :nums)res+=abs(x-y);
}
};