题目:Minimum Moves to Equal Array Elements II
Given a non-empty integer array, find the minimum number of moves required to make all array elements equal, where a move is incrementing a selected element by 1 or decrementing a selected element by 1.
You may assume the array's length is at most 10,000.
Example:
Input: [1,2,3] Output: 2 Explanation: Only two moves are needed (remember each move increments or decrements one element): [1,2,3] => [2,2,3] => [2,2,2]解析:最小的移动次数,如果数组是排好序的,则第一个和最后一个数要变成的相同的数则需要移动nums[n]-nums[0]次依次类推,快排的话时间复杂度为O(nlogn);
另一种解法则是求出中位数,计算每个元素到中位数移动的次数,求中位数使用Partition的思想,中位数前面的元素都比中位数小,后面的比中位数大,但不是必须
排序的,求中位数的时间复杂度为O(n),遍历求移动次数的时间复杂度也为O(n),所以整体的时间复杂度为O(n),下面给出两种解法代码
代码:
class Solution {
public:
int minMoves2(vector<int>& nums) {
int ans=0;
auto it=nums.begin()+nums.size()/2;
nth_element(nums.begin(),it,nums.end());
int mid=*it;
for (int i=0; i<nums.size(); i++)
{
ans+=abs(nums[i]-mid);
}
return ans;
/* int ans=0;
sort(nums.begin(),nums.end());
int i=0;
int j=nums.size()-1;
while(i<j)
{
ans+=(nums[j]-nums[i]);
i++;
j--;
}
return ans;*/
}
};