📜  给定数组中XOR为零的四对子(1)

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

给定数组中XOR为零的四对子

在给定的数组中,找到所有的四对子(i, j, k, l),使得 arr[i]^arr[j]^arr[k]^arr[l] = 0,其中 i < j < k < l。

思路

本题是一道经典的数组问题,可以通过哈希表或位运算来解决。

  1. 哈希表

遍历数组,将每个元素作为 key,出现次数作为 value 存入哈希表中。再遍历哈希表,对于 value 大于等于 4 的元素,即可得到用该元素构成四对子的方案。遍历哈希表的时间复杂度为 O(N),插入哈希表的时间复杂度为 O(N),因此总时间复杂度为 O(N)。

  1. 位运算

对于任意数字 a,有 a^a = 0。因此,对于四对子(i, j, k, l),有

arr[i] ^ arr[j] ^ arr[k] ^ arr[l] = (arr[i] ^ arr[j]) ^ (arr[k] ^ arr[l]) = 0

即,arr[i] ^ arr[j] = arr[k] ^ arr[l]。因此,我们可以枚举 arr[i] 和 arr[k],计算它们的异或值 x = arr[i] ^ arr[k],再遍历数组找到所有等于 x 的元素。这些元素必须与 arr[i] 和 arr[k] 分别组成一对,否则就不能构成四对子。我们可以用哈希表记录每个异或值 x 出现的位置,遍历数组时,对于任意一个元素 arr[j],我们只需要在哈希表中 O(1) 查找是否存在另一半 x-arr[j],如果存在即可组成一对。遍历数组的时间复杂度为 O(N),遍历哈希表的时间复杂度为 O(N),因此总时间复杂度为 O(N)。

代码示例
哈希表
def find_xors(arr):
    freqs = {}
    for num in arr:
        freqs[num] = freqs.get(num, 0) + 1
    ans = []
    for num, freq in freqs.items():
        if freq >= 4:
            ans.append([num] * 4)
    return ans
位运算
def find_xors(arr):
    x2idx = {}
    for i in range(len(arr)):
        for k in range(i+1, len(arr)):
            x = arr[i] ^ arr[k]
            if x not in x2idx:
                x2idx[x] = []
            x2idx[x].append((i, k))
    ans = []
    for j in range(len(arr)):
        for i, k in x2idx.get(arr[j], []):
            if i < j < k:
                ans.append([arr[i], arr[j], arr[k], arr[j]^arr[k]])
    return ans