友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
1442. 形成两个异或相等数组的三元组数目
给你一个整数数组 arr
。
现需要从数组中取三个下标 i
、j
和 k
,其中 (0 <= i < j <= k < arr.length)
。
a
和 b
定义如下:
-
a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]
-
b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]
注意:^ 表示 按位异或 操作。
请返回能够令 a == b
成立的三元组 (i
, j
, k
) 的数目。
示例 1:
输入:arr = [2,3,1,6,7] 输出:4 解释:满足题意的三元组分别是 (0,1,2), (0,2,2), (2,3,4) 以及 (2,4,4)
示例 2:
输入:arr = [1,1,1,1,1] 输出:10
示例 3:
输入:arr = [2,3] 输出:0
示例 4:
输入:arr = [1,3,5,7,9] 输出:3
示例 5:
输入:arr = [7,11,12,9,5,2,7,17,22] 输出:8
提示:
-
1 <= arr.length <= 300
-
1 <= arr[i] <= 108
思路分析

回溯,通过 46 / 47 测试用例。使用回溯应该对,但是加上备忘录后,还是有一个测试用例没通过。(看一个题解,原始解法就是暴力法。是对的。)
使用官方题解中的异或前缀和解法啦。数学知识还是得补啊!
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2025-05-28 21:33:59
*/
public int countTriplets(int[] arr) {
int length = arr.length;
int[] pre = new int[length + 1];
for (int i = 0; i < length; i++) {
pre[i + 1] = pre[i] ^ arr[i];
}
int result = 0;
// 优化前
// for (int i = 0; i < length - 1; i++) {
// for (int j = i + 1; j < length; j++) {
// for (int k = j; k < length; k++) {
// if (pre[i] == pre[k + 1]) {
// result++;
// }
// }
// }
// }
// 优化后
for (int i = 0; i < length - 1; i++) {
for (int k = i + 1; k < length; k++) {
if (pre[i] == pre[k + 1]) {
result += k - i;
}
}
}
return result;
}
参考资料
-
1442. 形成两个异或相等数组的三元组数目 - 新手篇 — 浅入深出系列1 — 看这个题解,我的回溯就是这里的暴力法,那应该是对的。