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;
        }
    
  • 相关阅读:
    Maven安装以及Idea安装
    EasyUi和jQuery模拟后台管理页面
    EasyUI初级入门2
    EasyUI初级入门
    JS高级
    好用的表单验证工具 vuelidate
    为页面/接口添加加载进度条
    Nuxt.js(二、解决首屏速度与SEO)
    Nuxt 的介绍与安装
    Axios及其async await封装
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12863300.html
Copyright © 2011-2022 走看看