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

发布时间 2023-11-16 10:17:53作者: DawnTraveler

(453. 最小操作次数使数组元素相等 - 力扣(LeetCode))

https://leetcode.cn/problems/minimum-moves-to-equal-array-elements/description/

题目描述

给你一个长度为 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,这样会导致时间大量浪费。
由于这里我们实际不关心绝对大小,只关心相对大小是否相等,
那么我们不如从反方面来思考,n-1个数据全部加1,相当于某一个数据-1
这样我们只要遍历一次数组,当所有数据都减为最小值时,循环结束。

当然这里不要真的一次次 nums[i]--; 弄个while循环直到nums[i] == min;每次count++
这里直接 count += nums[i]- min; 即可。
注意:n次减法的时间远远超过一次加法!

Code

  • 语言支持:C++

C++ Code:


class Solution {
public:
    int minMoves(vector<int>& nums) {
        int count = 0, min = *min_element(nums.begin(),nums.end());
        for (int num:nums){
            if (num > min) count += num- min;
        }
        return count;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)