【发布时间】:2020-04-29 14:56:18
【问题描述】:
Kadane 的算法可以找到我们最大的连续子数组和以及开始和结束索引,但连续子数组不一定总是最小的。例如:10 5 -12 7 -10 20 30 -10 50 60。整个数组的累积和是150。最后5个元素的累积和也是150。你将如何修改算法以找到最小的子数组?
【问题讨论】:
标签: algorithm dynamic-programming kadanes-algorithm
Kadane 的算法可以找到我们最大的连续子数组和以及开始和结束索引,但连续子数组不一定总是最小的。例如:10 5 -12 7 -10 20 30 -10 50 60。整个数组的累积和是150。最后5个元素的累积和也是150。你将如何修改算法以找到最小的子数组?
【问题讨论】:
标签: algorithm dynamic-programming kadanes-algorithm
我们可以在O(n) 中通过两次遍历来解决这个问题。在第一次遍历中,使用 Kadane 的算法找到最大和,S。对于第二次遍历,https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/solution/ 有一个很好的描述,即维护数组前缀和的索引的两端队列,以便能够保持prefix_left 的单调递增列表的索引,我们可以比较用prefix_right(当前索引)减去S。我们正在寻找最小的r - l,例如prefixes[l] ≤ prefixes[r] - S。在prefixes[l] ≥ prefixes[r] 时,向左弹出。然后在prefixes[l] ≤ prefixes[r] - S 更新解决方案并向左弹出(因为任何更大的r 索引只会针对相同的l 生成更大的间隔)。将y 追加到队列中。
【讨论】: