📌  相关文章
📜  最小化为使所有数组元素等于 1 而需要执行的给定操作的计数(1)

📅  最后修改于: 2023-12-03 15:10:36.157000             🧑  作者: Mango

最小化数组元素为1的操作次数
问题描述

给定一个长度为n的整数数组,现在要使所有数组元素都变为1。每次操作可以将一个元素减一,或者将一个元素除以2并向下取整。

请你输出使所有数组元素变为1的最小操作次数。

解题思路

对于该问题,我们可以使用贪心算法。

既然我们想让所有元素都变为1,那么我们可以首先将数组中所有的偶数都除以2。因为偶数通过除以2可以更快的变为1。

接下来我们可以将所有奇数都减1,因为减1后会变成偶数,可以快速的继续除以2。

一直执行上述两个操作,直到所有元素都变为1。

代码实现
def minimize(nums: List[int]) -> int:
    res = 0
    for num in nums:
        while num > 1:
            if num % 2 == 0:
                num //= 2
            else:
                num -= 1
            res += 1
    return res
测试样例
assert minimize([5,7,8]) == 7
assert minimize([1,2,3,4,5]) == 6
assert minimize([1000000000]) == 29
时间复杂度

该算法的时间复杂度为$O(nlog_2 m)$,其中m为所有元素的最大值,因为每次除以2后,数字至少会减小一半,最多除log2(m)次。空间复杂度为$O(1)$。