-
题目:
给你一个长度为 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 整数
思路 :
- 第一反应,暴力破解,每次除了最大值都 +1,统计次数(超时)
- 超时后想着优化,为啥要每次 +1 。我可以加上
最大值 - 最小值
反正最后结果都要相等,我一个一个的让他们相等。( 2261 ms 击败6.81%) - 认真思考后,可以简化题目。除了某个数其他数都+1,这个步骤是否等价与:除了这个数-1,其他数都不变。两个操作的结果是一样的,那我们就可以对所有数与最小值的差求和
示例一:(暴力超时)
class Solution {
public int minMoves(int[] nums) {
int maxIndex = 0;
int max = nums[0];
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
maxIndex = i;
}
if (nums[i] < min) {
min = nums[i];
}
}
int count = 0;
while (min != max) {
min++;
int tempIndex = maxIndex;
for (int i = 0; i < nums.length; i++) {
if (i != tempIndex) {
nums[i]++;
}
if (nums[i] > max) {
max = nums[i];
maxIndex = i;
}
}
count++;
}
return count;
}
}
示例二:(简单优化,勉强通过)
class Solution {
public int minMoves(int[] nums) {
int maxIndex = 0;
int max = nums[0];
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
maxIndex = i;
}
if (nums[i] < min) {
min = nums[i];
}
}
int count = 0;
while (min != max) {
int differenceValue = max - min;
min = max;
int tempIndex = maxIndex;
for (int i = 0; i < nums.length; i++) {
if (i != tempIndex) {
nums[i]+=differenceValue;
}
if (nums[i] > max) {
max = nums[i];
maxIndex = i;
}
}
count+=differenceValue;
}
return count;
}
}
示例三:(优秀)
class Solution {
public int minMoves(int[] nums) {
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] < min) {
min = nums[i];
}
}
int count = 0;
for (int num : nums) {
count += num - min;
}
return count;
}
}