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]; 具体代码就不写了