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;
    }
原文地址:https://www.cnblogs.com/yh-simon/p/12863300.html