📜  数组中唯一对的数量(1)

📅  最后修改于: 2023-12-03 14:54:58.982000             🧑  作者: Mango

数组中唯一对的数量

在数组中,如果一个数字对 (i, j) 满足下面两个条件中的任意一个,我们就认为这是一个 好的 数对:

  1. 0 <= i < j < nums.length
  2. 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 函数和位运算,如果不熟悉可以自行查阅相关资料。