目录
题目链接
https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/
题目
给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。 (该题为深信服笔试原题)
示例
输入:
[1,2,3]
输出:
3
解释:
只需要3次操作(注意每次操作会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
思路及代码
思路一 (n-1个数加1、转换成1个数减1)
一共有n个数,每次n-1个数同时加1,只有1个数不加,这就可以等价于每次只有1个数减1,求让数组所有元素相等的最小操作次数。转换成每次只有1个数减1处理起来就方便多了。所有元素最后相等,那最后的结果自然就是数组中最小的这个元素,每次操作只能对1个数减1,这样的话每个元素减去最小值求其和就是我们要的结果。
思路一 C++代码
class Solution {
public:
int minMoves(vector<int>& nums) {
int min = *min_element(nums.begin(), nums.end());
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i]-min;
}
return sum;
}
};
思路一 结果
思路二(数学方法)
假设原始数组总和为sum
,我们需要操作次数为m
,按照题意每次操作n - 1
个数,那么最后整个数组总和sum
增大m * (n - 1)
,这里的n
为数组长度,最后数组所有元素都相等为x
,于是有:
我们再设数组最小的元素为min
,m = x - min
,即 x = m + min 代
入上式可得:
因此,我们只需要知道原始数组总和sum
,数组中最小元素min
,数组长度n
,即可得出需要的最小操作次数m。
思路二 C++代码
class Solution {
public:
int minMoves(vector<int>& nums) {
int min = *min_element(nums.begin(), nums.end());
int sum=0;
int n=nums.size();
for(int i=0;i<n;i++)
{
sum+=nums[i];
}
return sum-min*n;
}
};
思路二 结果