For this, create a subsequence (here designated with ibeg
, iend
, and length len
) and basically march along the sequence, extending the subsequence at the end or shrinking it at the beginning to maintain >0. Since the inner loop is constrained by the length of the current sequence it is still 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
Then best_len
will be the length of the longest sequence, and best_ibeg
and best_iend
will be where it starts and ends, respectively.