📅  最后修改于: 2023-12-03 15:22:01.494000             🧑  作者: Mango
给定一个长度为n的整数数组,求其中按位或等于给定整数k的数对个数。
最简单的方法就是枚举所有的数对,判断它们的按位或是否等于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
这种解法显然不适用于数据规模较大的情况。
位运算是求解按位或问题的有效方法,可以将整数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),在时间复杂度上有了较大的提升。