Algorithm 如何找到具有最大和的最小连续子阵列?

Algorithm 如何找到具有最大和的最小连续子阵列?,algorithm,dynamic-programming,kadanes-algorithm,Algorithm,Dynamic Programming,Kadanes Algorithm,Kadane的算法可以找到最大连续子数组和以及起始和结束索引,但连续子数组不一定总是最小的。例如:105-127-102030-105060。整个阵列的累积和为150。最后5个元素的累积总和也是150。您将如何修改算法以找到最小的子阵列?我们可以通过两次遍历在O(n)中解决此问题。在第一次遍历中,使用Kadane算法查找最大和,s。对于第二次遍历,很好地描述了如何维护数组前缀和的索引的两端队列,以便能够保持单调递增的prefix\u left列表的索引,我们可以将其与prefix\u right

Kadane的算法可以找到最大连续子数组和以及起始和结束索引,但连续子数组不一定总是最小的。例如:105-127-102030-105060。整个阵列的累积和为150。最后5个元素的累积总和也是150。您将如何修改算法以找到最小的子阵列?

我们可以通过两次遍历在
O(n)
中解决此问题。在第一次遍历中,使用Kadane算法查找最大和,
s
。对于第二次遍历,很好地描述了如何维护数组前缀和的索引的两端队列,以便能够保持单调递增的
prefix\u left
列表的索引,我们可以将其与
prefix\u right
(当前索引)减去
s
进行比较。我们正在寻找最小的
r-l
前缀[l]≤ 前缀[r]-S。而
前缀[l]≥ 前缀[r]
,向左弹出。然后while
前缀[l]≤ 前缀[r]-S
更新解决方案并向左弹出(因为任何更大的
r
索引只会针对相同的
l
生成更大的间隔)。将
y
附加到队列。

我们可以在
O(n)
中通过两次遍历来解决这个问题。在第一次遍历中,使用Kadane算法查找最大和,
s
。对于第二次遍历,很好地描述了如何维护数组前缀和的索引的两端队列,以便能够保持单调递增的
prefix\u left
列表的索引,我们可以将其与
prefix\u right
(当前索引)减去
s
进行比较。我们正在寻找最小的
r-l
前缀[l]≤ 前缀[r]-S。而
前缀[l]≥ 前缀[r]
,向左弹出。然后while
前缀[l]≤ 前缀[r]-S
更新解决方案并向左弹出(因为任何更大的
r
索引只会针对相同的
l
生成更大的间隔)。将
y
追加到队列中