形成两个异或相等数组的三元组数目
我是垃圾,第一时间连前缀和都没想到~~~。
说说这道题吧,首先想到的思路是三次循环,然后在第三重循环中再套一重循环求a和b的值,判断是ab否相等。
时间复杂度为n^4,结果没有任何悬念的超时了。
附上代码:
class Solution {
// 暴力解法
public int countTriplets(int[] arr) {
int cnt = 0;
for( int i = 0; i < arr.length; ++i ){
for( int j = i + 1; j < arr.length; ++j ){
for( int k = j; k < arr.length; ++k ){
int a = arr[i];
int b = arr[j];
for( int i1 = i + 1; i1 < j; ++i1 ){
a ^= arr[i1];
}
for( int j1 = j + 1; j1 <= k; ++j1 ){
b ^= arr[j1];
}
if( a == b ){
++cnt;
}
}
}
}
return cnt;
}
}
作者:mai-jia-jun
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/solution/xing-cheng-liang-ge-yi-huo-xiang-deng-sh-rbu7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
然后再也没有往前缀和想了,哭晕~~~
在上一题的基础上,引入哈希表,将区间做key
代码如下:
class Solution {
// 使用cache存储已被计算了的区间的异或值,减少了重复计算
public int countTriplets(int[] arr) {
int cnt = 0;
Map<Integer,Integer> cache = new HashMap<>();
for( int i = 0; i < arr.length; ++i ){
for( int j = i + 1; j < arr.length; ++j ){
for( int k = j; k < arr.length; ++k ){
int a = arr[i];
int b = arr[j];
int key = i * arr.length + j - 1;
if( cache.containsKey(key) ){
int val = cache.get(key);
a = val;
}else {
for( int i1 = i + 1; i1 < j; ++i1 ){
a ^= arr[i1];
}
cache.put(key,a);
}
key = j * arr.length + k;
if( cache.containsKey(key) ){
int val = cache.get(key);
b = val;
}else {
for( int j1 = j + 1; j1 <= k; ++j1 ){
b ^= arr[j1];
}
cache.put(key,b);
}
if( a == b ){
++cnt;
}
}
}
}
return cnt;
}
}
作者:mai-jia-jun
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/solution/xing-cheng-liang-ge-yi-huo-xiang-deng-sh-rbu7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
异或前缀和
异或前缀和算法LeetCode官方给的题解很好理解,我这里就不赘述了
直接附上代码:
class Solution {
// 使用前缀和思想
public int countTriplets(int[] arr) {
// 异或前缀和数组
int s[] = new int[arr.length + 1];
for( int i = 1; i < s.length; ++i ){
s[i] = s[i - 1] ^ arr[i - 1];
}
int cnt = 0;
for( int i = 0; i < arr.length; ++i ){
for( int k = i + 1; k < arr.length; ++k ){
if( s[k + 1] == s[i] ){
cnt += k - i;
}
}
}
return cnt;
}
}
作者:mai-jia-jun
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/solution/xing-cheng-liang-ge-yi-huo-xiang-deng-sh-rbu7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。