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]
分析:

高中数学问题,假设最后归一的数是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;  
    }
}


猜你喜欢

转载自blog.csdn.net/THEONE10211024/article/details/78393712
今日推荐