开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
453. 最小操作次数使数组元素相等
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/mi…
给你一个长度为 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 <=
- <= nums[i] <=
- 答案保证符合 32-bit 整数
解法
- 观察规律法:为了方便,令原数组 num 的总和为 sum,最小值为 min,最大值为 max,长度为 n,真实最小操作次数为 ans。
由于每次只能将 n−1 个元素整体加1, 每次修改1,因此在最终的相等状态,整体元素的大小值 t 满足关系 n*t = sum + (n-1)*ans
另外观察规律有最小值肯定每次参加元素变化,基于此得到一个关系t = min + ans
代入上述式子得到
ans = sum - n * min
- python
class Solution:
def minMoves(self, nums: List[int]) -> int:
n = len(nums)
total = sum(nums)
min_value = min(nums)
return total - min_value * n
- c++
class Solution {
public:
int minMoves(vector<int>& nums) {
int n = nums.size();
int total = 0;
long int min_value = pow(10, 9);
for(int i=0; i<n; i++)
{
total += nums[i];
if (nums[i] < min_value)
min_value = nums[i];
}
return total - n * min_value;
}
};
复杂度分析
-
时间复杂度:O(n)
-
空间复杂度:O(1)