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) 的数目。
前缀和,将前缀求出,那么a^b就简单了很多
我自己想的方法没有看出这道题后面的规律,三层循环,费时间了
class Solution {
public int countTriplets(int[] arr) {
int n=arr.length;
int cnt=0;
int []pre=new int[n+1];
for(int i=1;i<=n;i++)
pre[i]=pre[i-1]^arr[i-1];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int k=j;k<n;k++){
if((pre[i]^pre[j])==(pre[j]^pre[k+1]))
cnt++;
}
}
}
return cnt;
}
`
看了解析,发现如果ab 等价于a^b0这样就更简单了
附上解析的代码
class Solution:
def countTriplets(self, arr: List[int]) -> int:
if len(arr)<2:
return 0
ans=0
for i in range(len(arr)):
temp=arr[i]
for j in range(i+1,len(arr)):
temp=temp^arr[j]
if temp==0:
ans+=j-i
return ans
本文探讨了一种高效算法,用于计算数组中能形成两个异或相等数组的三元组数目。通过使用前缀和技巧,简化了a和b的异或比较过程,避免了三层循环的时间浪费。附带解析代码,展示了如何优化计算流程。
5万+

被折叠的 条评论
为什么被折叠?



