5405.形成两个异或相等数组的三元组数目
提示
1 <= arr.length <= 300
1 <= arr[i] <= 10^8
暴力解题
思路
- 枚举所有情况O(n^4)
- 很明显,时间超时
代码
/*
*超时 O(n^4)
*/
public int countTriplets(int[] arr) {
int ans=0;
int len=arr.length;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
for(int k=j;k<len;k++){
int a=0,b=0;
for(int p=i;p<j;p++){
a^=arr[p];
}
for(int q=j;q<=k;q++){
b^=arr[q];
}
if(a==b){
System.out.println("i="+i+"j="+j+"k="+k);
ans++;
}
}
}
}
return ans;
}
优化
- 时间复杂度O(n^3)
代码
/*
*24ms O(n^3)
*/
public int countTriplets2(int[] arr) {
int ans=0;
int len=arr.length;
for(int i=0;i<len;i++){
int a=arr[i];
for(int j=i+1;j<len;j++){
int b=0;
for(int k=j;k<len;k++){
b^=arr[k];
if(a==b){
ans++;
}
}
a^=arr[j];
}
}
return ans;
}
解题二
思路
-
看透本质 (菜鸡我做题时没看出来)
-
a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1] b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
-
a==b转化为a^b == 0,再有a,b的定义可知 相当于arr[i]^...arr[k] == 0
-
i!=k ,且当条件成立时,j的位置可取可能有 k-i 种方案。换言之,确定i 、k的位置,当满足题设时,统计j的所有取值,该值即为 k-i
-
时间复杂度 O(n^2) 1ms
代码
/**
*确定 i k 的位置 在符合 a^b==0的前提下 统计j的可能值,该值为k-i;
*/
public int countTriplets3(int[] arr){
if(arr==null||arr.length==0) return 0;
int ans=0,len=arr.length;
for(int i=0;i<len;i++){
int sum=arr[i];
for(int k=i+1;k<len;k++){
sum^=arr[k];
if(sum==0){
ans+=k-i;
}
}
}
return ans;
}