假设我们有一个n个实数的数组。我们希望在数组中找到最长的连续子序列,它的和大于或等于零。
必须在线性时间内完成。
我们实际上不知道如何开始回答这个问题。
提前致谢。
答案 0 :(得分:1)
为此,创建一个子序列(此处指定为ibeg
,iend
和长度len
)并基本沿着序列前进,在末尾扩展子序列或缩小它开始维持> 0。由于内环受当前序列的长度约束,因此它仍然是O(N)。
var ibeg = 0;
var iend = 0;
var len = 0;
var best_len = -1, best_ibeg = 0, best_iend = 0;
var acc = 0;
var i = 0;
var N = length(sequence);
while i<N
acc += sequence(i);
len++;
iend++;
if acc>0
if len>best_len
best_len = len;
best_ibeg = ibeg;
best_iend = iend;
end
else
while ibeg<=iend
acc -= sequence(ibeg);
ibeg++;
if acc>0, break; end
end
end
end
然后best_len
将是最长序列的长度,best_ibeg
和best_iend
将分别开始和结束。