问题详见: 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]
解题思路:
一开始如果按照找平均数然后计算的结果并非正确,这是由于类似[1,0,0,8,6]这样的数其平均数为3,按平均数移动需要2+3+3+5+3=16步,然而如果按照中位数1的话则只需0+1+1+7+5=14步,所以该题是按照中位数计算最小移动步数。所以只需查找到中位数即可很方便求出答案,整个算法复杂度为 O(n) 。具体算法如下:
class Solution {
public:
int minMoves2(vector<int>& nums) {
int n = nums.size();
auto it = nums.begin() + n/2;
nth_element(nums.begin(), it, nums.end());
int median = *it;
int total = 0;
for (auto &i : nums)
total += abs(i-median);
return total;
}
};
其提交运行结果如下: