题目描述:
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]分析:
高中数学问题,假设最后归一的数是x,那么移动的总次数为:|a1-x| + |a2-x| + |a3-x|+.....+ |an-x|。问题转换为求多个绝对值相加最小值的问题。假设a1 a2 a3 ...an是有序数组,那么有:
①n=2k
|a1 - x|+|an - x|>=|a1 - an| (当且仅当x∈[a1,an]时取=)
|a2 - x|+|an-1 - x|>=|a2 - an-1| (当且仅当x∈[a2,an-1]时取=)
|ak - x|+|ak+1 - x|>=|ak - ak+1| (当且仅当x∈[ak,ak+1]时取=)
所以:当x∈[ak,ak+1]值最小。
②n=2k-1
|a1 - x|+|an - x|>=|a1 - an| (当且仅当x∈[a1,an]时取=)
|a2 - x|+|an-1 - x|>=|a2 - an-1| (当且仅当x∈[a2,an-1]时取=)
|ak-1 - x|+|ak+1 - x|>=|ak-1 - ak+1| (当且仅当x∈[ak-1,ak+1]时取=)
最后还剩:|ak - x|所以:当x=ak的之后值最小。
综上所述:x = ak的时候值最小。
代码:
class Solution {
public int minMoves2(int[] nums) {
Arrays.sort(nums);//保证是有序数组
int x = nums[nums.length / 2];
int min = 0;
for (int i : nums) {
min += Math.abs(i - x);
}
return min;
}
}