Loading

【力扣】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) 的数目。

 

示例 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] <= 10^8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//时间复杂度:O(n^3)
    //空间复杂度:O(n)
    public int countTriplets(int[] arr) {
        int length = arr.length;

        int xor[] = new int[length+1];
        for(int i = 0; i < length; i++){
            xor[i+1] = xor[i] ^ arr[i];
        }
        int result = 0;
        for(int i = 0; i < length; i++){
            for(int j = i+1; j< length; j++){
                for(int k= j; k < length;k++){
                    //int a = xor[i] ^ xor[j];
                    //int b = xor[j] ^ xor[k+1];
                    //可以不用判断a == b 直接判断 xor[i] == xor[k+1]
                    if(xor[i] == xor[k+1]){
                        result++;
                    }
                }
            }
        }
        return result;
    }

 

两层循环:

//时间复杂度:O(n^2)
    //空间复杂度:O(n)
    public int countTriplets(int[] arr) {
        int length = arr.length;

        int xor[] = new int[length+1];
        for(int i = 0; i < length; i++){
            xor[i+1] = xor[i] ^ arr[i];
        }
        int result = 0;
        for(int i = 0; i < length; i++){
            for(int k= i+1; k < length;k++){
                    //int a = xor[i] ^ xor[j];
                    //int b = xor[j] ^ xor[k+1];
                    //可以不用判断a == b 直接判断 xor[i] == xor[k+1]
                if(xor[i] == xor[k+1]){
                    //这里变更为 += (k-i) 这是因为减少了中间层j,我们判断是否满足的条件中也没有j需要,但是result需要遍历 k - i 次。
                    result += (k-i);
                }
            }
        }
        return result;
    }

 

自古评论出人才:

public int countTriplets(int[] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            int ans = arr[i];
            for (int k = i + 1; k < arr.length; k++) {
                ans ^= arr[k];
                if(ans == 0) {
                    count += k - i;
                }
            }
        }
        return count;
    }

 

posted @ 2021-05-18 15:19  冯廷鑫  阅读(79)  评论(0编辑  收藏  举报