小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
最小操作次数使数组元素相等
该题出自力扣的453题——最小操作次数使数组元素相等【简单题】,解法消化于官方题解
审题
原题:给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
-
(×)方法一:
- 对数组先排序
- while循环,判断数组内元素是否一致
- 对数组内 n - 1 的元素+1
- 时间复杂度O(n的4次方),死于超时
-
(√)方法二:
- n-1个元素+1;反之也就是最大的元素-1;
- 很明显,相比于n-1元素+1,只对一个元素操作会有利
- 取出数组最小元素,依次取元素相减的操作数相加,即为所需答案
- 因为无需求出最后元素,所以只关注操作数即可
代码实现
/**
* 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
* 输入:nums = [1,2,3]
* 输出:3
* 解释:
* 只需要3次操作(注意每次操作会增加两个元素的值):
* [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
* @param nums
* @return
*/
public static int minMoves(int[] nums) {
int minNum = Arrays.stream(nums).min().getAsInt();
int res = 0;
for (int num : nums) {
res += num - minNum;
}
return res;
}
总结
- 时间复杂度:O(n),其中 n 为数组中的元素数量。我们需要一次遍历求出最小值,一次遍历计算操作次数。
- 空间复杂度:O(1)。