【发布时间】:2020-10-03 19:22:03
【问题描述】:
我在网上看到过解决方案,但所有解决方案都有 O(n) 或 O(n^2) 时间复杂度。我想知道是否可以在不使用辅助数据结构的 O(nlogn) 中找到总和为 0 的子数组。但是,我们可以使用递归。
我们可以修改最大子数组求和算法来解决这个问题吗?
输入数组将只有 1 和 -1,算法将找到总和为 0 的子数组。
输入 = { 1, 1, -1, 1, -1, -1, 1, -1}
output = 1, 8(1 为起始索引,8 为最后索引)
在这种特殊情况下,整个输入数组的和等于 0。因此,报告的开始和结束索引分别为 1 和 8(假设数组中的索引从 1 开始)。
编辑:我们可以使用这个问题的解决方案来解决另一个问题。问题如下。
给定一个包含 n 个整数的数组 arr,找到最长的连续子数组,其中偶数和奇数元素的数量相等。下面是一个例子(索引从 1 开始):
A = {8, 2, -3, 4, 9, 6}
答案:(2, 5)。 (2 为起始索引,5 为最后索引)
唯一的限制是算法不能使用任何辅助数据结构。在这种约束下,解决方案必须是最有效的。此外,允许使用递归。
【问题讨论】:
-
可能比
O(n)更好是不可能的,你必须至少扫描一次数组。 -
@ZabirAlNazi,他并没有要求更好。
-
对不起,我完全错过了。
-
一定要分而治之吗?它可以使用递归(以及递归后使用的空间)吗?可以是 O(n) 吗?
-
限制是不能使用任何辅助数据结构。它不必分而治之。它只需要在不使用辅助数据结构的约束下尽可能快。
标签: algorithm divide-and-conquer