假设我们有一个整数数组arr。我们要选择三个索引,例如i,j和k,其中(0 <= i <j <= k <N),N是数组的大小。a和b的值如下:a = arr [i] XOR arr [i + 1] XOR ... XOR arr [j-1] b = arr [j] XOR arr [j + 1] XOR .. 。XOR arr [k]我们必须找到三元组(i,j,k)的数量,其中a与b相同。
因此,如果输入类似于[2,3,1,6,7],则输出将为4,因为三元组分别为(0,1,2),(0,2,2),(2,3 ,4)和(2,4,4)
为了解决这个问题,我们将遵循以下步骤-
ret:= 0
n:= arr的大小
对于初始化i:= 1,当i <n时,更新(将i增加1),-
x2:= x2 XOR arr [j]
ret:= ret + m [x2]
x1:= x1 XOR arr [j]
(将m [x1]增加1)
定义一张映射
x1:= 0,x2:= 0
对于初始化j:= i-1,当j> = 0时,更新(将j减1),-
对于初始化j:= i,当j <n时,更新(将j增加1),-
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int countTriplets(vector<int>& arr) { int ret = 0; int n = arr.size(); for (int i = 1; i < n; i++) { map<int, int> m; int x1 = 0; int x2 = 0; for (int j = i - 1; j >= 0; j--) { x1 = x1 ^ arr[j]; m[x1]++; } for (int j = i; j < n; j++) { x2 = x2 ^ arr[j]; ret += m[x2]; } } return ret; } }; main(){ Solution ob; vector<int> v = {2,3,1,6,7}; cout << (ob.countTriplets(v)); }
{2,3,1,6,7}
输出结果
4