链接
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