zoukankan      html  css  js  c++  java
  • 5405.形成两个异或相等数组的三元组数目

    image-20200510141219181

    提示

    • 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;
        }
    
  • 相关阅读:
    RESTful Web 服务
    关于 Java API for RESTful Web Services (JAX-RS) 介绍
    IPV6正则表达式
    使用MyBatis-generator 自动生成MyBatis代码
    JSON.stringfy妙用
    浅拷贝与深拷贝
    vue双向绑定原理与实践
    vue路由当中的导航钩子中关于next()方法的理解
    Promise 异步备忘
    封装van-popup为自己的弹窗组件解决v-moel props单向数据流不能修改的问题。
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12863300.html
Copyright © 2011-2022 走看看