Algorithm 如何找到具有最大和的最小连续子阵列?
Kadane的算法可以找到最大连续子数组和以及起始和结束索引,但连续子数组不一定总是最小的。例如:105-127-102030-105060。整个阵列的累积和为150。最后5个元素的累积总和也是150。您将如何修改算法以找到最小的子阵列?我们可以通过两次遍历在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
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
追加到队列中