【每日一题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

目录
相关文章
|
7月前
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
53 1
|
7月前
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
47 1
|
7月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
51 0
|
7月前
|
存储
【每日一题Day253】LC2两数相加 | 链表模拟
【每日一题Day253】LC2两数相加 | 链表模拟
25 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
60 0
|
7月前
力扣421. 数组中两个数的最大异或值(字典树)
力扣421. 数组中两个数的最大异或值(字典树)
|
7月前
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
47 1
|
7月前
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
43 0
|
7月前
【每日一题Day299】LC2235两整数相加
【每日一题Day299】LC2235两整数相加
31 0
|
7月前
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
38 0