0
点赞
收藏
分享

微信扫一扫

剑指offer_067 最大的异或

悄然丝语 2022-03-10 阅读 26

题目:

示例 1:

示例 2:

示例 3:

示例 4:

示例 5:

提示:

代码:

class Solution {
    public int findMaximumXOR(int[] nums) {
        int res = 0;
        for (int i = 1; i < nums.length; i++) {
            add(nums[i - 1]);
            res = Math.max(res, search(nums[i]));
        }
        return res;
    }

    class TreeNode {
        TreeNode[] next = new TreeNode[2];
    }
    TreeNode root = new TreeNode();

    public void add(int num) {
        TreeNode cur = root;
        for (int i = 30; i >= 0; i--) {
            int index = (num >> i) & 1;
            if (cur.next[index] == null) {
                cur.next[index] = new TreeNode();
            }
            cur = cur.next[index];
        }
    }

    public int search(int num) {
        TreeNode cur = root;
        int max = 0;
        for (int i = 30; i >= 0; i--) {
            int index = (num >> i) & 1;
            max = max << 1;
            if (cur.next[index ^ 1] == null) {
                cur = cur.next[index];
            } else {
                cur = cur.next[index ^ 1];
                max ++;
            }
        }
        return max;
    }
}

解题思路:

这道题乍一看很难,其实只有两个地方可能会比较刁钻一点。

一个是如何把数字按二进制存储到前缀树中,另一个是异或操作的时候应该在前缀树上怎么走。

存储的时候直接 for (int i = 30; i >= 0; i--) {
                                int index = (num >> i) & 1;

就可以啦。

异或的时候,如果当前是 1 ,就尽量让他去找 0 ,如果当前是 0 ,就尽量让他去找 1 ,这样才可以最大化。我们注意到 1 异或 1 为 0 , 0 异或 1 为 1,所以在前缀树上寻找路径逻辑的代码也就写出来啦。然后再用一个值来记录最大值就行啦。最后遍历数组,进行比较。

注意:

少吃零食多看报。

参考链接:

 力扣

举报

相关推荐

0 条评论