zoukankan      html  css  js  c++  java
  • 【力扣】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;
        }
    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    cookie和session
    ViewState与Session 的重要区别
    C#.Net 中ArrayList 与 Array的区别
    c#如何把文件夹压缩打包然后下载
    关于并发的处理
    const和readonly的区别
    计算某列的字符串相加sql语句
    MS SQL Server存储过程批量修改用户表所有者
    已有打开的与此命令相关联的DataReader,必须首先将它关闭
    XML与数据库
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/14780990.html
Copyright © 2011-2022 走看看