如果您想要最大的连续数字总和,那么类似的方法可能会起作用:
$cur = $max = 0;foreach ($seq as $n){ $cur += $n; if ($cur < 0) $cur = 0; if ($cur > $max) $max = $cur;}那只是我的头上,但似乎是正确的。(忽略它假定0是空集和所有否定集的答案。)
编辑:
如果您还想要序列位置:
$cur = $max = 0;$cur_i = $max_i = 0; $max_j = 1;foreach ($seq as $i => $n){ $cur += $n; if ($cur > $max) { $max = $cur; if ($cur_i != $max_i) { $max_i = $cur_i; $max_j = $max_i + 1; } else { $max_j = $i + 1; } } if ($cur < 0) { $cur = 0; $cur_i = $i + 1; }}var_dump(array_slice($seq, $max_i, $max_j - $max_i), $max);可能会有更简洁的方法。同样,它具有相同的假设(至少一个正整数)。此外,它仅找到第一个最大序列。
编辑:将其更改为使用
max_j(专有)而不是
max_len。



