📅  最后修改于: 2023-12-03 15:22:34.438000             🧑  作者: Mango
该主题涉及到问题:找出给定数组中任意两个数的乘积为2的幂固定数值的对数,并返回这些对的数量。本文将向您介绍该问题的解决方案。文中提供了三种方法:暴力解法、哈希表解法和位运算解法。
暴力解法的思想是枚举数组中的每一对数,并判断它们的乘积是否为2的幂。时间复杂度是O(N^2)。
def countPairs(nums, val):
count = 0
for i in range(len(nums)-1):
for j in range(i+1, len(nums)):
if nums[i]*nums[j] == val and isPowerOfTwo(nums[i]*nums[j]):
count += 1
return count
# 判断一个整数是否为2的幂
def isPowerOfTwo(n: int) -> bool:
if n <= 0:
return False
return (n & (n-1)) == 0
哈希表解法的思想是在数组中的每个数寻找它乘以一定的2的次幂等于所要求的目标数。时间复杂度是O(N)。
def countPairs(nums, val):
hash_table = {}
count = 0
for num in nums:
hash_table[num] = hash_table.get(num, 0) + 1
for num in nums:
for i in range(32):
power = 2**i
if power-num in hash_table and (power-num != num or hash_table[num] > 1):
count += hash_table[power-num]
return count//2
位运算解法的思想是使用位运算来判断一个整数是否是2的幂,然后利用位运算计算两个数的乘积是否是2的幂。时间复杂度是O(N)。
def countPairs(nums, val):
count = 0
for i, num in enumerate(nums):
for j in range(i+1, len(nums)):
if (num*nums[j] & (num*nums[j]-1)) == 0 and num*nums[j] != 0:
count += 1
return count
本文介绍了如何解决“找出给定数组中任意两个数的乘积为2的幂固定数值的对数,并返回这些对的数量”这一问题。我们提供了三种解决方案: 暴力解法、哈希表解法和位运算解法。这三种方法的时间复杂度均为O(N)或O(N^2),但哈希表解法是最优的,因为它将时间复杂度降到了线性。