【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树

简介: 【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树

数组中两个数的最大异或值【LC421】

Given an integer arraynums, return the maximum result ofnums[i] XOR nums[j], where 0 <= i <= j < n.

字典树
  • 思路

image.png

  • 从字典树的根节点开始遍历,并从最高位往低位查询,优先让每一位的异或结果为1,即优先匹配与之不同的二进制位【局部最优】,这样才能使最终的异或结果最大【全局最优】,
  • 实现
class Solution {
    class TrieNode{
        TrieNode[] next = new TrieNode[2];
    }
    TrieNode root = new TrieNode();
    public int findMaximumXOR(int[] nums) {
        TrieNode root;
        int res = 0;
        for (int num : nums){
            add(num);
            res = Math.max(search(num) ^ num, res);
        }
        return res;
    }
    public void add(int x){
        TrieNode p = root;
        for (int i = 31; i >= 0; i--){
            int u = (x >> i) & 1;
            if (p.next[u] == null) p.next[u] = new TrieNode();
            p = p.next[u];
        }
    } 
    public int search(int x){
        int res = 0;
        TrieNode p = root;
        for (int i = 31; i >= 0; i--){
            int u = (x >> i) & 1, v = 1 - u; 
            if (p.next[v] != null) {
                res |= (v << i);
                p = p.next[v];
            }else {
                res |= (u << i);
                p = p.next[u];
            }         
        }
        return res;
    }
} 

image.png

目录
相关文章
|
5月前
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
49 1
|
5月前
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
【每日一题Day202】LC1015可被 K 整除的最小整数 | 模运算
49 2
|
5月前
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
42 1
|
5月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
46 0
|
5月前
|
存储
【每日一题Day253】LC2两数相加 | 链表模拟
【每日一题Day253】LC2两数相加 | 链表模拟
23 0
|
11月前
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
48 0
|
5月前
力扣421. 数组中两个数的最大异或值(字典树)
力扣421. 数组中两个数的最大异或值(字典树)
|
5月前
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
38 1
|
10月前
|
存储 算法
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
|
5月前
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
39 0