LeetCode 每日一题:1442. 形成两个异或相等数组的三元组数目
分析:
维护一个异或前缀和数组 pre(pre[i] 表示 [0,i) 之间所有数的异或和),那么问题所求的两个 a、b 数组则可以表示为
a: pre[i] ^ pre[j]
b: pre[j] ^ pre[k]
那么 a == b => pre[i] ^ pre[j] = pre[j] ^ pre[k] => pre[i] = pre[k]
所以枚举所有的 i 、j、 k 并统计答案即可
代码:
O(n^3)
class Solution {
public int countTriplets(int[] arr) {
int len = arr.length;
int[] pre = new int[len + 1];
for (int i = 0; i < len; i++) {
pre[i + 1] = pre[i] ^ arr[i];
}
int ans = 0;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
for (int k = j; k < len; k++) {
if (pre[i] == pre[k + 1]) {
ans++;
}
}
}
}
return ans;
}
}
O(n^2)
class Solution {
public int countTriplets(int[] arr) {
int len = arr.length;
int[] pre = new int[len + 1];
for (int i = 0; i < len; i++) {
pre[i + 1] = pre[i] ^ arr[i];
}
int ans = 0;
for (int i = 0; i < len; i++) {
for (int k = i + 1; k < len; k++) {
if (pre[i] == pre[k + 1]) {
ans += k - i;
}
}
}
return ans;
}
}