Given anon-emptyinteger array of sizen, find the minimum number of moves required to make all array elements equal, where a move is incrementing n- 1 elements by 1.

Input:
[1,2,3]

Output:
3

Explanation:
Only three moves are needed (remember each move increments two elements):

[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

这道题要求每次对size为n数组中的n - 1个元素加1,最终使得整个数组所有元素相等。暴力求解的话,每次检查整个数组是否相等,如果不相等,找出最大的数,并对除最大数以外的所有数加1。但是暴力解法会超时。

我们可以逆向思维,目标是使所有数相等,对除最大数以外的数加1,和把最大的数减1的效果实际上是一样的。所以我们可以干脆找出最小的数,move的次数就是所有元素与最小值的差的总和

class Solution {
    public int minMoves(int[] nums) {
        if(nums == null || nums.length <= 1)
            return 0;

        int min = 0;
        for(int i = 1; i < nums.length; i++) {
            if(nums[i] < nums[min]) {
                min = i;
            }
        }

        int count = 0;
        for(int i = 0; i < nums.length; i++)
            count += nums[i] - nums[min];

        return count;
    }
}

看了一下leetcode上的答案,还有一种dp解法,虽然没啥必要,但是考虑到Google那帮老逼就喜欢搞dp,所以还是简单提一下:先排序,a[i]为index从0到i - 1所需要的最少步数,a[i + 1] = a[i] + nums[i + 1] - nums[i]; 具体代码就不写了

results matching ""

    No results matching ""