最小操作次数使数组元素相等-力扣453
问题描述
给你一个长度为 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 整数
思路分析
因为只需要找出让数组所有元素相等的最小操作次数,不需要考虑各个元素的绝对大小,即不需要算出数组中所有元素相等时的元素值,只需要考虑数组中元素相对大小的变化即可。
注意到,每次操作既可以理解为使 n?1 个元素增加 1,也可以理解使 1 个元素(即最大元素)减少 1。
于是,要计算让数组中所有元素相等的操作数,我们只需要计算将数组中所有元素都减少到数组中元素最小值所需的操作数,即计算
我刚开始做时候,想到了n-1个元素加1等价于最大元素-1,但是没有想到总的操作数等于所有元素都减少到数组中元素最小值所需的次数,而是傻傻的用while循环判断数组元素是否全部相等,每次循环时都将数组从小到大排序,再将最大元素-1,以此来计算操作数,看了这个方法后才恍然大悟!!
代码样例
class Solution {
public:
int minMoves(vector<int>& nums)
{
int minNum = *min_element(nums.begin(),nums.end());
int count = 0;
for (int i : nums)
{
count+= i - minNum;
}
return count;
}
};
|