Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

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]

 

觉得和“算法”知识无关的简单题反而有点难度啊……首先固定了每次都要使得n-1个元素+1,那么这n-1个一定是最小的n-1个,否则就会越加越多。每次都找最小的n-1个去加,直到所有的数相等。换个角度,就等于每次找到最大的那个数使得其-1,直到最大和最小的数相等。最终,所有比最小的那个数大的数,都要变成最小的数。所以,结果就是求所有数与最小数差的和。即,所有数的和与最小数与数组长度乘积的差。本题就是个逻辑推理和数学式的简化。感觉算法有的时候就是数学竞赛啊……

 


Java

class Solution {
    public int minMoves(int[] nums) {
        int min = nums[0], sum = 0;
        for (int num : nums) {
            if (num < min)
                min = num;
            sum += num;
        }
        return sum - nums.length * min;
    }
}

 

posted on 2018-08-07 21:34  小T在学习  阅读(219)  评论(0编辑  收藏  举报