📅  最后修改于: 2023-12-03 15:10:36.157000             🧑  作者: Mango
给定一个长度为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)$。