设p = {x1,x2,...,xn}是任意数的序列(正数或负数)。给出O(n)时间算法以找到连续元素xi,xi + 1,...,xj的子序列,其总和在所有连续子序列上是最大的。例如,对于X = {2,5,-10,3,12,-2,10,-7,5},{3,12,-2,10}是一种解决方案。可能重复:
Maximum Contiguous Subsequence Sum of At Least Length L
答案 0 :(得分:1)
使用动态编程可以解决此问题。
假设你的输入是数组a
,你可以创建一个长度相同的数组S
。
以下是问题的重现关系。
S[i] = S[i-1] + a[i] > a[i] ? S[i-1] + a[i] : a[i]
基本案例:S[0] = a[0]
保持max
跟踪最大金额。最后返回max
。
答案 1 :(得分:0)
答案是http://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane.27s_algorithm
这个算法背后的想法是我们假设我们知道长度为N的数组的问题的真正最大子数组,并且我们知道从两端开始的最大子数组。 (理由:如果我们假设我们知道接触末端的最大序列,并且我们逐渐将更多元素添加到最后,那么我们就不能错过真正的最大子阵列,因为在某些时候添加到末尾的元素将是相同的元素作为真正最大子阵列的终点。)添加额外元素可能会增加附加到末尾的最长子阵列的长度。如果子阵列的总和低于0,我们重置它。如果它高于我们当前最佳候选解决方案的真正最大子阵列,我们将取代我们的最佳候选解决方案。
或者,我们可以使用集成的力量。 (这是你可以免费做的O(N)传递;你也可以免费区分。)然后我们查看所有的极值,搜索两个极值MIN和MAX,这样MAX就在MIN的右边(或者否则你会找到最负的总和),并且MAX-MIN(连续总和)也是最大的。你可以暴力破解这个子问题(如果极数小于sqrt(N),仍然是O(N)),或者你可以用更有效的方式解决它[可以在这里使用一些帮助]。
答案 2 :(得分:-3)
这是所有非负元素的序列,很容易在线性O(n)
时间内找到。