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]
本题是上一道题leetcode 453. Minimum Moves to Equal Array Elements 的变种,
其实第一种方法最棒,很奇妙的想法。
参考这个链接[LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
代码如下:
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <cmath>
using namespace std;
class Solution
{
public:
int minMoves2(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int res = 0, i = 0, j = (int)nums.size() - 1;
while (i < j)
{
res += nums[j] - nums[i];
j--;
i++;
}
return res;
}
int minMoves2ByMidean(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int res = 0, mid = nums[nums.size() / 2];
for (int num : nums)
res += abs(num - mid);
return res;
}
};