📌  相关文章
📜  计数对,它们的总和仅由设置的位组成(1)

📅  最后修改于: 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 是哈希表中不同的计数数目。

总结

计数位设置相同的数对是一道使用哈希表解决的经典问题,可以通过使用哈希表记录位数出现的次数来简化问题,从而避免使用暴力枚举的算法,提高程序的效率和执行速度。