Если вам нужна наибольшая сумма последовательных чисел, то может сработать что-то вроде этого:
$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
.