algorithm - 找到总和相同且长度相同的子数组

标签 algorithm

假设有两个长度相同的数组[an]和[bn],求是否有[an]和[bn]两个子数组,使得子数组的和相同且长度相同。例如:[an] = [5,4,17,10,29], [bn]=[1,22,23,4,15],程序会返回“yes”,因为[17,10]在[ [bn] 中的 an] 和 [23,4] 具有相同的总和和相同的长度。有没有比 O(n^3) 更好的算法?

最佳答案

(好吧,如果我指出一个 O(n^2) 版本,也许我会向做得更好的人学习)。假设对于每个数组,您计算前 k 个元素的总和,对于所有 k = 1 到数组长度,以便 [5,4,17,10,29] 变成 [5,9,26,36,65 ].显然,只需保持总计,您就可以在 O(n) 中做到这一点。

现在您可以通过从另一个中减去一个运行总和来计算该数组的任何部分的总和,例如17 + 10 = 36 - 9。因此您可以在时间 O(n^2) 内计算出所有连续子数组的 O(n^2) 和。将一个子数组的结果输入哈希表,然后计算另一个子数组的所有结果,并检查它们是否在哈希表中。哈希表操作(概率)为 O(1),因此总成本为 O(n^2)

关于algorithm - 找到总和相同且长度相同的子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059216/

相关文章:

linux - 从一台到 100 台服务器的文件复制

java - 使用第 1、2 或 3 步计算到达第 4 个楼梯的方式

c - 提高效率 "lighthouse"

java - 32位数字中1的个数

algorithm - 找到给定空间和约束点的距离最小的点?

c# - 渐进光标移动算法 - Kinect SDK

python - 当字符串等价于旋转时

php - 我对这个编程挑战的解决方案是错误的,因为它为 10/11 测试用例输出了错误的答案。那些测试用例是什么?

python - 使用二进制补码在 DEC(基数 10)和 HEX(基数 16)之间转换

algorithm - 强信号量队列纪律和饥饿