📜  从给定数组中按位或等于K的对对计数(1)

📅  最后修改于: 2023-12-03 15:22:01.494000             🧑  作者: Mango

从给定数组中按位或等于K的对对计数

介绍

给定一个长度为n的整数数组,求其中按位或等于给定整数k的数对个数。

解决方案
方法1:暴力法

最简单的方法就是枚举所有的数对,判断它们的按位或是否等于k,时间复杂度为O(n^2)。

def count_pairs(arr, k):
    res = 0
    n = len(arr)
    for i in range(n):
        for j in range(i + 1, n):
            if arr[i] | arr[j] == k:
                res += 1
    return res

这种解法显然不适用于数据规模较大的情况。

方法2:位运算

位运算是求解按位或问题的有效方法,可以将整数k表示成二进制形式,然后针对每个二进制位进行判断。

def count_pairs(arr, k):
    res = 0
    n = len(arr)
    for i in range(32):
        mask = 1 << i
        count_1 = 0
        for j in range(n):
            if arr[j] & mask != 0:
                count_1 += 1
        count_0 = n - count_1
        if k & mask != 0:
            # k在这一位上是1
            res += count_1 * count_0
        else:
            # k在这一位上是0
            res += count_1 * (count_1 - 1) // 2 + count_0 * (count_0 - 1) // 2

    return res

这个方法对于每一位,分别统计数组中该位为0和1的数的个数,然后根据k在该位上的值进行分类讨论。如果k在该位上是1,那么将该位为0和1的数的个数相乘即为满足条件的数对个数;如果k在该位上是0,那么分别计算该位为0和1的数目的组合数即可。

总结

本文介绍了两种计算数组中按位或等于k的数对个数的方法,分别为暴力法和位运算。通过位运算,可以将问题从O(n^2)提升到O(32n),在时间复杂度上有了较大的提升。