https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/
class Solution {
    class Trie {
        private Trie nxt[] = new Trie[2];
        public void insert(int num) {
            Trie p = this;    //直接将当前对象当作头节点
            for (int i = 30; i >= 0; --i) {
                /* 将所有数字都化为30位二进制数,先插入最高位 */
                int b = (num >> i) & 1;
                if (p.nxt[b] == null) {
                    p.nxt[b] = new Trie();
                }
                p = p.nxt[b];
            }
            /* 因为所有序列都是30位的,所以不需要标注序列是否结尾了 */
        }
        public int find(int num) {
            //找到和num异或后最大的数
            Trie p = this;
            int ret = 0;
            for (int i = 30; i >= 0; --i) {
                int b = (num >> i) & 1;
                if (p.nxt[1 - b] != null) {
                    //要使异或值最大,则最好与num在该位取相反值
                    b = 1 - b;
                }
                p = p.nxt[b];
                ret = ret * 2 + b;
            }
            return ret;
        }
    }
    public int findMaximumXOR(int[] nums) {
        Trie root = new Trie();
        int ans = 0;
        for (int num : nums) {
            root.insert(num);
        }
        for (int num : nums) {
            ans = Math.max(ans, num ^ root.find(num));
        }
        return ans;
    }
}


京公网安备 11010502036488号