1707. 与数组中元素的最大异或值
https://leetcode-cn.com/problems/maximum-xor-with-an-element-from-array/
题目描述
前置知识
异或
位运算
剪枝
双指针
公司
暂无
思路
PS:使用 JS 可以平方复杂度直接莽过。不过这个数据范围平方意味着 $10^(10)$ 次运算,很难想象这是怎么 AC 的。
使用前缀树的思路和 字节跳动的算法面试题是什么难度?(第二弹) 第二题比较像,很多人的解法也是如此,我就不贴了。如果还是不懂得同学,建议先看下 421. 数组中两个数的最大异或值,基本就是一个前缀树的模板。
下面介绍一个 预处理 + 双指针的方法。
和 421. 数组中两个数的最大异或值 类似,核心一句话要记住。
不要关心 x 最后和 nums 中的谁异或了,只关心最终异或的数的每一位分别是多少。
以 nums[0,1,2,3,4], x 为 9 为例,给大家讲解一下核心原理。
具体算法:
首先对数据进行预处理,建立一个二维 dp 数组, dp[i][j] 是和 nums[j] 第 i 位相等的最小的数组下标。
为了使用双指针,我们需要对 nums 进行排序
接下来对每一个查询,我们调用 solve 函数计算最大的异或值。
solve 函数内部使用双指针,比较头尾指针和 x 的异或结果。更新异或结果较小的那个即可。
代码
复杂度分析
时间复杂度:$O(max(NlogN, 32*Q))$,其中 Q 为 queries 长度,N 为 nums 长度。
空间复杂度:$O(32*N)$,其中 N 为 nums 长度。
最后更新于