leetCode每日一题-2021/05/18-形成两个异或相等数组的三元组数目

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

我是垃圾,第一时间连前缀和都没想到~~~。
说说这道题吧,首先想到的思路是三次循环,然后在第三重循环中再套一重循环求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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode,算法与数据结构,异或,算法,java)