给出一个数组,打印该数组中所有总和为0的子数组。
Example-:
Input: arr = [6, 3, -1, -3, 4, -2, 2,
4, 6, -12, -7]
Output:
Subarray found from Index 2 to 4
Subarray found from Index 2 to 6
Subarray found from Index 5 to 6
Subarray found from Index 6 to 9
Subarray found from Index 0 to 10
我在极客身上看到了这种解决方案:
https://www.geeksforgeeks.org/print-all-subarrays-with-0-sum/
但是我想知道他们是否有办法解决时间复杂度小于O(n ^ 2)的问题。
答案 0 :(得分:1)
简短答案:输出比例为 O(n 2 ),因此我们无法对其进行改进。此外,给定比例尺的链接算法,因为地图在 O(1)中与输出呈线性关系,因此在时间复杂度方面是最佳的。
想象一个只有零的 n 个数字数组。这意味着每个子列表的总和为零。因此,我们必须打印 O(n 2 )结果。最坏的情况是,此问题本质上是 O(n 2 ),因为它有时具有 O(n 2 )在输出中。
请注意,您所引用的实现平均可以快得多,因为它会将每个前缀与该前缀的总和一起存储在键中。根本没有说每个项目都有线性的“ co-sum”。此外,该算法在输出的大小上运行 linear ,因此在时间复杂度方面是最佳的。这里我们假设可以在 O(1)中执行在地图中的插入和查找。