LeetCode: 453. 最小操作次数使数组元素相等

75 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 <= 10510^5
  • 109-10^9 <= nums[i] <= 10910^9
  • 答案保证符合 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)