📌  相关文章
📜  使数组递减所需的最少步骤(1)

📅  最后修改于: 2023-12-03 14:49:36.635000             🧑  作者: Mango

使数组递减所需的最少步骤

问题描述

给定一个整数数组 nums,每次操作将会把任意一个元素减少 1。返回让数组递减的最小操作次数。

示例
输入:nums = [3,2,1,2,1,7]
输出:6
解释:
对于每个元素,需要以下操作:
- 3 减少 2 次变为 1
- 2 减少 1 次变为 1
- 1 不需要操作
- 2 减少 1 次变为 1
- 1 不需要操作
- 7 减少 6 次变为 1
解题方法
方法一:暴力枚举

很容易想到使用暴力枚举的方式,每次找到数组中的最大值,将其减 1,然后继续找最大值。直到数组中所有元素都被减到了 0。

时间复杂度:O(N^2)。

代码如下:

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        res = 0
        while any(nums):
            max_num = max(nums)
            for i in range(len(nums)):
                if nums[i] == max_num:
                    nums[i] -= 1
                    res += 1
        return res
方法二:贪心算法

在方法一的基础上,我们发现我们每次都找最大值并减 1,这等价于将所有元素减 1,但不会改变任何元素之间的相对大小关系。因此我们可以直接将所有元素都减到最小值。

时间复杂度:O(N)。

代码如下:

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        res = 0
        min_num = min(nums)
        for num in nums:
            res += num - min_num
        return res
总结

该题目实际上也是一道贪心算法的应用题,通过将所有元素都减到最小值,也可以满足题目要求,同时时间复杂度更低。