与数组中元素的最大异或值(字典树)(小于等于某元素的最大异或值)
Posted 秦枫-_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与数组中元素的最大异或值(字典树)(小于等于某元素的最大异或值)相关的知识,希望对你有一定的参考价值。
先回忆下字典树:
而这个题需要查找nums中小于等于矩阵第二列元素的元素并且跟第一列元素异或的最大值,所以我们需要先把矩阵按照第二列元素sort一下,然后每次构建二叉树时只构建小于等于当前元素的部分,并在其中查找最大值
class Solution {
class Tree{
Tree []son=new Tree[2];
}
Tree root=new Tree();
void establish(int x){
Tree roo1=root;
for(int i=30;i>=0;i--){
int t=x>>i&1;
if(roo1.son[t]==null)roo1.son[t]=new Tree();
roo1=roo1.son[t];
}
}
int check(int x){
Tree roo2=root;
int res=0;
for(int i=30;i>=0;i--){
int t=x>>i&1;
if(roo2.son[t^1]==null){
res*=2;
roo2=roo2.son[t];
}
else{
res=res*2+1;
roo2=roo2.son[t^1];
}
}
return res;
}
public int[] maximizeXor(int[] nums, int[][] queries) {
HashMap<int[],Integer>map=new HashMap<>();
for(int i=0;i<queries.length;i++){
map.put(queries[i],i);
}
Arrays.sort(nums);
Arrays.sort(queries,new Comparator<int[]>(){
public int compare(int[]a,int[]b){
return a[1]-b[1];
}
});
int idx=0;
int []res=new int[queries.length];
for(int[]q:queries){
while(idx<nums.length&&q[1]>=nums[idx]){
establish(nums[idx++]);
};
if(idx==0)res[map.get(q)]=-1;
else res[map.get(q)]=check(q[0]);
}
return res;
}
}
以上是关于与数组中元素的最大异或值(字典树)(小于等于某元素的最大异或值)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode每日一题——1707. 与数组中元素的最大异或值(字典树)
LeetCode1707. 与数组中元素的最大异或值 (字典树)/ 990. 等式方程的可满足性(并查集)