📅  最后修改于: 2023-12-03 14:49:36.243000             🧑  作者: Mango
给定一个长度为n的整数数组nums,每次可以将数组中任意一个元素除以2,直到所有元素均相等。求最少需要多少次操作。
由于每次只能将一个元素除以2,因此我们考虑将所有元素除以2,这样所有偶数位上的元素都变为了原来的一半,然后我们再将所有偶数位上的元素继续除以2,以此类推,直到所有元素都相等。
注意到由于要将一个整数除以2,因此如果一个元素不是偶数,那么它必须要被减去1才能进行除法操作。因此,我们可以将所有元素减去它们二进制下的最后一位1所表示的数,将它们变为偶数,然后再进行除法操作。这一做法的时间复杂度为$O(n \log \max { \text{nums} })$。
class Solution:
def minOperations(self, nums: List[int]) -> int:
ans = 0
while any(num % 2 == 1 for num in nums):
for i in range(len(nums)):
if nums[i] % 2 == 1:
nums[i] -= 1
ans += 1
nums = [num // 2 for num in nums]
ans += 1
return ans
时间复杂度:$O(n \log \max { \text{nums} })$。
空间复杂度:$O(1)$。