📅  最后修改于: 2023-12-03 14:57:26.113000             🧑  作者: Mango
计数位设置相同的数对是指对于给定的整数数组和位数 k,寻找所有在其二进制表示中有 k 个设置的位,且它们的二进制表示相同的数对个数,并返回这个个数的数值。
我们可以用哈希表来记录每一个数字中设置的位数,然后再遍历一遍哈希表,计算方案数。
首先,我们需要一个函数,用于计算二进制数中设置的位数。
def count_bits(num: int) -> int:
count = 0
while num:
num &= num - 1
count += 1
return count
这个函数的时间复杂度为 O(k),其中 k 是 num 中设置的位数。
接下来,我们可以遍历整个数组,对于每个数字,将它在二进制下的位数表示计算出来后,使用哈希表来记录每个不同的位数出现的次数。
def count_pairs(nums: List[int], k: int) -> int:
bit_counts = collections.defaultdict(int)
for num in nums:
bit_counts[count_bits(num)] += 1
接下来,我们遍历哈希表,对于每个不同的位数,计算产生的数对个数并累加到答案中。
ans = 0
for count in bit_counts:
if k - count in bit_counts:
ans += bit_counts[count] * bit_counts[k - count]
return ans // 2
由于每个数对会被计算两次,所以最终的答案要除以 2。
时间复杂度为 O(nk+m),其中 n 是数组的大小,m 是哈希表中不同的计数数目,k 是位数。
空间复杂度为 O(m),其中 m 是哈希表中不同的计数数目。
计数位设置相同的数对是一道使用哈希表解决的经典问题,可以通过使用哈希表记录位数出现的次数来简化问题,从而避免使用暴力枚举的算法,提高程序的效率和执行速度。