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,最后使所有元素相等。如果我们逆向思考一下,相当于说,每次我们选择一个最大元素,把它减1,最后也会使所有元素均相等。这两种方式的次数是相同的,最大元素减1的次数就是本题的解。
设数组的长度为n,数组所有元素和为sum, 数组的最小值为min,最大元素减一的次数为k,则有
元素相等时的数组元素和 == 原始数组元素和 - 减掉的部分,即:
n * min = sum - 1 * k,这里k为待求,所以k = sum - n * min
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;
int sum = 0;
for(int i = 0; i < nums.length; i++) {
min = Math.min(min, nums[i]);
sum += nums[i];
}
return sum - nums.length * min;
}