algorithm - 子序列的最大长度,使得每个连续元素的按位异或为 k
问题描述
我试图解决这个问题,我们必须找到子序列的最大长度,使得每个连续元素的 XOR 等于 keg:Array = [3,2,4,3,5] 和 k=1。答案是 3. subsequence = [3,2,3]
到目前为止,我已经尝试了这些方法:
- 天真的双循环解决方案,我们将使用两个循环并找到 XOR 等于 k 的子序列。这种方法给了我超时,因为数组中的元素数量可以达到 10^5.Psuedo 代码:
int finalAns=0;
loop (i=0...n):
int xortillnow = array[i], count=1; // since we have already selected one element
loop(j=i+1..n):
if((xortillnow ^ array[i])==k):
count++;
xortillnow = xortillnow ^ array[i];
finalAns = max(count,finalAns);
2.其次我正在考虑动态编程,我可以存储已经计算的子序列的异或,但我无法完成算法。
有人可以告诉一些其他方法来解决这个问题。
解决方案
XOR 运算符有一个很好的属性,即对于任何值 x,只有一个值 y,其中 x ⊕ y = k。具体来说,值 y 由 x ⊕ k 给出,因为
(x ⊕ k) ⊕ k = x ⊕ (k ⊕ k) = x ⊕ 0 = x。
所以想象一下从左到右扫描数组。每次你看到一个新元素时,它可以
- 成为当前长度为 1 的新子序列的开始,或
- 继续现有的子序列,但前提是 x ⊕ k 在序列中出现在它之前。如果 x ⊕ k 确实出现,则子序列的长度将等于 1 加上最长子序列的长度,此属性以 x ⊕ k 结尾。
这为这个问题提供了一个相对简单的算法。维护哈希表或 BST 将先前看到的值映射到子序列的最大长度,此属性以该值结尾。从左到右扫描整个阵列。对于每个元素 x,计算 x ⊕ k 并检查它是否在表中。如果是这样,记录 x 的长度为 m + 1,其中 m 是为 x ⊕ k 存储的长度。如果不是,记录 x 的长度为 1。
这需要使用 BST 的确定时间 O(n log n) 和使用哈希表的预期时间 O(n)。
推荐阅读
- vue.js - vuejs中可以在组件中动态添加组件
- javascript - 在 JavaScript 中连接嵌套数组时测试失败
- java - 如何确定在文本字段中输入的时间是否在两个预先确定的开市和收市时间范围内?
- google-cloud-platform - 如何查看从 Firebase 分析导入到谷歌分析的转化事件?
- javascript - 从 Html 将数据/元素名称传递给 TypeScript 类
- javascript - 如何用 JS 设置 img attr
- connectycube - 需要在 React Native 的后台、前台和终止状态下支持 connectycube 视频通话
- amazon-s3 - 是否可以分块反序列化 ORC 文件?
- reactjs - 我可以将顺风类名作为 React 中的道具传递吗?
- php - 'pg_connect()' 我需要什么库?