最小操作次数使数组元素相等
难度:
标签:
题目描述
给你一个长度为 n
的整数数组,每次操作将会使 n - 1
个元素增加 1
。返回让数组所有元素相等的最小操作次数。
示例 1:
输入:nums = [1,2,3] 输出:3 解释: 只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
示例 2:
输入:nums = [1,1,1] 输出:0
提示:
n == nums.length
1 <= nums.length <= 105
-109 <= nums[i] <= 109
- 答案保证符合 32-bit 整数
代码结果
运行时间: 31 ms, 内存: 16.9 MB
/**
* Problem: Given an integer array of length n, each operation increases n - 1 elements by 1.
* The task is to find the minimum number of operations needed to make all elements equal.
*
* Solution Approach:
* 1. Using Java Streams to find the minimum element and calculate the sum of all elements.
* 2. The minimum operations required are calculated as the total sum minus n times the minimum element.
*/
import java.util.Arrays;
public class Solution {
public int minMoves(int[] nums) {
int min = Arrays.stream(nums).min().getAsInt();
int sum = Arrays.stream(nums).sum();
return sum - nums.length * min;
}
}
解释
方法:
本题可以转换思路:每次操作将 n - 1 个元素增加 1,等价于每次操作将 1 个元素减少 1。因此,要使所有元素相等,只需要将所有元素减少到数组中的最小值。所以,最小操作次数就是所有元素与最小元素的差值之和。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在解释中提到,每次操作将n-1个元素增加1等价于每次操作将1个元素减少1,这种转换的逻辑依据是什么?
▷🦆
解法中计算最小操作次数为所有元素与最小元素的差值之和,这种方法是否考虑了数组中可能存在的负数和其对结果的影响?
▷🦆
你是如何确定只减少到数组中的最小值就是最优解,有没有可能存在更小的操作次数达到目标的情况?
▷🦆
代码中使用了`min(nums)`和`sum(nums) - len(nums) * min_val`来计算操作次数,对于极大或极小的输入值,这种方法是否有溢出的风险?
▷