前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >给定一个数组,求子数组的最大异或和

给定一个数组,求子数组的最大异或和

原创
作者头像
大学里的混子
修改2019-02-26 10:21:37
9890
修改2019-02-26 10:21:37
举报
文章被收录于专栏:LeetCodeLeetCode

一、给定一个数组,求子数组的最大异或和

解法一:O(N^3)

代码语言:javascript
复制
public static int getMaxEOR1(int[] arr){
    int max = Integer.MIN_VALUE;
    for (int i = 0 ; i < arr.length ;i++){
        for (int start = 0 ;start <= i;start++) {
            int res = 0;
            for (int j = start; j <= i; j++) {
                res ^= arr[j];
            }
            max = Math.max(max, res);
        }
    }
    return max;
}

解法二:O(N^2)

代码语言:javascript
复制


    public static int getMaxEOR2(int[] arr){
        int max = Integer.MIN_VALUE;
        int[] dp = new int[arr.length];
        int eor = 0;
        for (int i = 0 ; i < arr.length; i++){
            eor ^= arr[i];  // 0 .. i 的异或和
            max = Math.max(max,eor);  // 由于下面的start的初始为1 没有包括0 ,
                                      // 所以这里需要将0..i的包括进来
            for (int start = 1 ; start <= i ;start++){ 
                //求的是start .. i 的异或和 ,start = 1 .. i
                int curROR = eor ^ dp[start - 1];
                max = Math.max(max,curROR);
            }
            dp[i] = eor;
        }
        return max;
    }

解法三:O(N^)

前缀树的解法

代码语言:javascript
复制
public static class Node {
   public Node[] nexts = new Node[2];
}

public static class NumTrie {
   public Node head = new Node();

   public void add(int num) {
      Node cur = head;
      for (int move = 31; move >= 0; move--) {
         int path = ((num >> move) & 1);
         cur.nexts[path] = cur.nexts[path] == null ? new Node() : cur.nexts[path];
         cur = cur.nexts[path];
      }
   }

   public int maxXor(int num) {
      Node cur = head;
      int res = 0;
      for (int move = 31; move >= 0; move--) {
         int path = (num >> move) & 1;
         int best = move == 31 ? path : (path ^ 1);
         best = cur.nexts[best] != null ? best : (best ^ 1);
         res |= (path ^ best) << move;
         cur = cur.nexts[best];
      }
      return res;
   }

}

public static int maxXorSubarray(int[] arr) {
   if (arr == null || arr.length == 0) {
      return 0;
   }
   int max = Integer.MIN_VALUE;
   int eor = 0;
   NumTrie numTrie = new NumTrie();
   numTrie.add(0);
   for (int i = 0; i < arr.length; i++) {
      eor ^= arr[i];
      max = Math.max(max, numTrie.maxXor(eor));
      numTrie.add(eor);
   }
   return max;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、给定一个数组,求子数组的最大异或和
    • 解法一:O(N^3)
      • 解法二:O(N^2)
        • 解法三:O(N^)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档