【问题标题】:How to find the smallest contiguous subarray with maximum sum?如何找到具有最大和的最小连续子数组?
【发布时间】: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


    【解决方案1】:

    我们可以在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 追加到队列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 2012-10-22
      • 2013-09-13
      • 2014-10-31
      • 2021-01-21
      • 2020-01-22
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多