友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

1442. 形成两个异或相等数组的三元组数目

给你一个整数数组 arr

现需要从数组中取三个下标 ijk ,其中 (0 <= i < j <= k < arr.length)

ab 定义如下:

  • 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

思路分析

1442 10

回溯,通过 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;
}