题目

给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。

第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或(XOR)得到的最大值。换句话说,答案是 max(nums[j] XOR xi) ,其中所有 j 均满足 nums[j] <= mi 。如果 nums 中的所有元素都大于 mi,最终答案就是 -1 。

返回一个整数数组 answer 作为查询的答案,其中 answer.length == queries.length 且 answer[i] 是第 i 个查询的答案。

示例 1:

输入:nums = [0,1,2,3,4], queries = [[3,1],[1,3],[5,6]]
输出:[3,3,7]
解释:

  1. 0 和 1 是仅有的两个不超过 1 的整数。0 XOR 3 = 3 而 1 XOR 3 = 2 。二者中的更大值是 3 。
  2. 1 XOR 2 = 3.
  3. 5 XOR 2 = 7.
    示例 2:

输入:nums = [5,2,4,6,6,3], queries = [[12,4],[8,1],[6,3]]
输出:[15,-1,5]

解题思路

  • 将查询数组queries[i] = [xi, mi],按照m进行排序,并且记录下原来每个查询所在的位置。
  • 将nums数组也进行排序,这样的话,只需要每一个查询维护一个单调递增的指针cur即可,满足nums[cur]<=mi,而nums[0…cur]里面的元素也是小于mi的,因为排序以后的查询数组的mi是递增的,所以每遍历完一个查询queries[i] = [xi, mi],下一个遍历只需要把cur指针移动至满足num[cur]<=mi+1即可。

字典树

因为nums[j]的取值范围为0 <= nums[j], xi, mi <= 109,所以我们只需要将nums[j]的后30位取出来构造字典树即可,从根节点到叶子节点,代表从高位到低位,Trie[] children=new Trie[2]代表下一位是否可以取0或者1,例如下标0为null的话,证明下一位不能为0。所以找最大的异或结果的话,可以通过从根节点开始,尽量走一些使得当前位异或结果为1的路径,因为根节点到叶子节点是从高位到低位的,所以优先选择使得异或高位为1

代码

class Solution {public int[] maximizeXor(int[] nums, int[][] queries) {int n=queries.length;int[] res = new int[n];int[][] nq = new int[n][3];Arrays.sort(nums);for (int i = 0; i < n; i++) {nq[i][0]=queries[i][0];nq[i][1]=queries[i][1];nq[i][2]=i;}int cur=0;Trie root = new Trie();Arrays.sort(nq,(o1, o2) -> o1[1]-o2[1]);for (int i = 0; i < n; i++) {while (cur<nums.length&&nums[cur]<=nq[i][1]){root.add(nums[cur]);++cur;}res[nq[i][2]]=cur==0?-1:root.get(nq[i][0]);}return res;}
}
public class Trie{static final int h=30;Trie[] children=new Trie[2];void add(int val){Trie node=this;for (int i=h-1;i>=0;i--){int cur=(val>>i)&1;if(node.children[cur]==null){node.children[cur]=new Trie();}node=node.children[cur];}}int get(int val){Trie node=this;int res=0;for (int i=h-1;i>=0;i--){int t=(val>>i)&1;if(node.children[t^1]!=null){res|=1<<i;t^=1;}node=node.children[t];}return res;}}

leetcode 1707. 与数组中元素的最大异或值相关推荐

  1. LeetCode 1707. 与数组中元素的最大异或值(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由非负整数组成的数组 nums .另有一个查询数组 queries ,其中 queries[i] = [xi, mi] . 第 i 个查询的答案是 ...

  2. LeetCode 1471. 数组中的 k 个最强值(排序)

    1. 题目 给你一个整数数组 arr 和一个整数 k . 设 m 为数组的中位数,只要满足下述两个前提之一,就可以判定 arr[i] 的值比 arr[j] 的值更强: |arr[i] - m| > ...

  3. ios 替换数组中元素_ios可变数组的所有操作

    #pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...

  4. JavaScript Array reverse 方法:颠倒数组中元素的顺序

    在JavaScript中,Array对象的reverse()方法将颠倒(反转)数组中元素的顺序.arr.reverse()在原数组上实现这一功能,即,reverse()会改变原数组. 例1:将数组元素 ...

  5. 汇编语言LENGTHOF运算符:计算数组中元素的个数

    LENGTHOF 运算符计算数组中元素的个数,元素个数是由数组标号同一行出现的数值来定义的.示例如下: .data byte1 BYTE 10,20,30 array1 WORD 30 DUP (?) ...

  6. 交换二维数组元素c语言,二维数组中元素替换问题!

    二维数组中元素替换问题! 题目:对某个二维数组右上三角的全部元素(不包括对角线上的元素)做如下变换: (1)若该数是偶数,则找到左下三角中和它关于对角线对称的元素用这两个元素的最大公约数替换该数 (2 ...

  7. B09_NumPy迭代数组(控制遍历顺序,修改数组中元素的值,使用外部循环,广播迭代)

    NumPy迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用arange()函数 ...

  8. C++与C语言中有关数组中元素排序

    C++与C语言中有关数组中元素排序 C语言中 ​ #include<stdio.h> #define n 4 int main(){ int a[n]; int i,j,temp; for ...

  9. 获取数组中元素值为偶数的累加和与元素值为奇数的累加和,并计算他们之间的差值

    /*** 1.获取数组中元素值为偶数的累加和与元素值为奇数的累加和,并计算他们之间的差值* 1.定义int getNum(int[] arr)静态方法,该方法要求完成* 1.1 获取指定数组arr中元 ...

最新文章

  1. mysql与access数据库_mysql数据库和access数据库有什么不同吗?
  2. An Introduction to Hashing in the Era of Machine Learning
  3. Leet Code OJ 235. Lowest Common Ancestor of a Binary Search Tree [Difficulty: Easy]
  4. vscode 不能运行h5c3代码_让开发效率“飞起”的VS Code 插件
  5. 详解道路标记数据集 CeyMo: See More on Roads -- A Novel Benchmark Dataset for Road Marking Detection
  6. TCP客户端服务器(Python)
  7. spring cloud构建互联网分布式微服务云平台-高可用的服务注册中心
  8. CentOS 6.2配置NIS主/从服务器
  9. StackPanel 控件自动出现滚动条
  10. 商品分析是什么?该怎么做(入门版)
  11. 复选框点击后弹出输入框
  12. 语音服务器登录失败,设置语音邮件用户被锁定前的登录失败次数:Exchange 2013 帮助 | Microsoft Docs...
  13. android room 简书,Android Room 的坑
  14. 大数据人才培养的规划之路如何走
  15. [开心学php100天]第六天:用php玩转页面(基础篇)
  16. 【转载】:Autolisp:利用AuoCAD之Lisp编程案例之智能加工齿轮的演示程序-----一个处女座程序猿
  17. 笔记本电脑同时连接内外网亲测有效
  18. Latex如何插入多个图片,实现并排排列或者多行多列排列
  19. win10连接虚拟机ftp服务器配置,win10虚拟机ftp服务器
  20. ECharts(3)

热门文章

  1. select、poll、epoll 比较
  2. C语言中.和->区别
  3. 第七章 进程环境 | 001 命令形参、gcc与g++的使用
  4. idea教程--Maven 骨架介绍
  5. el表达式取值优先级
  6. 函数的定义,语法,二维数组,几个练习题
  7. UITableView,UICollectionView,UIScrollView快速返回顶部
  8. Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决
  9. iphone开发如何隐藏各种bar
  10. RUNOOB python练习题33 使用join方法实现用逗号分隔列表