📅  最后修改于: 2023-12-03 14:54:58.982000             🧑  作者: Mango
在数组中,如果一个数字对 (i, j) 满足下面两个条件中的任意一个,我们就认为这是一个 好的 数对:
0 <= i < j < nums.length
nums[i]
和 nums[j]
的位运算结果等于 nums[j]
和 nums[i]
的位运算结果。换句话说,如果 nums[i] XOR nums[j] == nums[j] XOR nums[i]
,其中 XOR
是异或运算符。
给你一个整数数组 nums
,返回 好的 数对 的数量。
输入:nums = [1, 2, 3, 4, 7]
输出:2
解释:
好的数对 (0, 2),(1, 3),此外还有一个好的数对 (2, 3) 没有被计数。
这道题暴力的思路就是双重循环,枚举所有数对。检查每个数对是否满足条件,如果满足条件就计数。但是暴力算法时间复杂度是 $O(n^2)$,显然不可行。
听说你很聪明,那么你一定想到了用哈希表来优化这个双重循环。用哈希表记录每个数字出现的次数,同时遍历数组,对于数组中每个数,枚举所有可能的异或值。如果这个异或值出现在哈希表中,我们就将其对应的出现次数计入答案。
时间复杂度 $O(n \log C)$,其中 C 是数据范围,因为我们要枚举每一位,时间复杂度为 $\log C$。
下面是代码片段:
class Solution:
def countPairs(self, nums: List[int]) -> int:
cnt = defaultdict(int)
for num in nums:
for j in range(0, 22): # 枚举异或值
x = num & (1 << j)
cnt[x] += 1
ans = 0
for num in nums:
for j in range(0, 22):
x = num & (1 << j)
if cnt[x] > 0:
ans += cnt[x] - 1 # 减去自身
return ans // 2
其中使用了 Python 的 defaultdict 函数和位运算,如果不熟悉可以自行查阅相关资料。