原题链接:
https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/
题目描述
给你一个长度为 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,那么我假设目前数组的总和为sum,最少需要移动的次数为m,所以说整体数组的总和最终会增加m * (n - 1)。
小明: 宇哥所言极是!👍
宇哥: 最终所有元素都相等,这里我设为x。那么,sum + m * (n - 1) = x * n;
小明: 对,就是这样。然后呢?这不还是有两个未知数嘛,无解呀🙃
宇哥: 别急嘛,这里我假设数组中最小的元素为min,你难道没发现m = x - min😏
小明: 嗦嘎!😮,所以联立这两个方程就可以得出m = sum - min * n;
宇哥: Bingo!🎉
注意: 此处还应考虑到数据超出范围的问题!
AC代码:
class Solution {
public:
int minMoves(vector<int>& nums) {
int ans = 0;
sort(nums.begin(),nums.end());
int min = nums[0], n = nums.size();
for(int i = 0; i < n; i++){
ans += nums[i] - min;
}
return ans;
}
};