【每日一题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最大单词长度乘积 | 哈希表 位运算
55 1
|
7月前
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
48 1
|
7月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
53 0
|
7月前
【每日一题Day155】LC1630等差子数组 | 枚举+排序
【每日一题Day155】LC1630等差子数组 | 枚举+排序
46 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
62 0
|
7月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
51 0
|
7月前
力扣421. 数组中两个数的最大异或值(字典树)
力扣421. 数组中两个数的最大异或值(字典树)
|
算法 C++
剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)
剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)
|
7月前
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表
45 0
|
7月前
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
【每日一题Day151】LC1625执行操作后字典序最小的字符串 | BFS
42 0