LeetCode - 453. Minimum Moves to Equal Array Elements

链接

453. Minimum Moves to Equal Array Elements

题意

给定一个大小为n的非空数组,定义这样一个操作(move):每次都可以选择n-1个元素进行加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]

思路

为了最少步达到所有元素相等的状态,那么每次肯定是让除了最大元素外的所有元素加1。但这个题目仅仅要求所有元素相等,而并没有要求所有元素等于某个确定的值。所以可得,n-1个元素加1是为了更加接近最大值(其他元素和最大值的差距减1),那么可以逆向思维理解为:每次选取一个最大值减1,这样也是更加接近最小值(最大值和其他元素的差距减1)。那么次数就很好算了:每个数减最小数的值之和。也即:sum(arr)-n*min(arr)

代码

Java:

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

效率

Your runtime beats 91.71% of java submissions

posted @ 2017-04-19 16:15  zyoung  阅读(125)  评论(0)    收藏  举报