我最近采访了一家公司,他们要求我编写一种算法,该算法可以找到数组中元素总数最大的子序列。数组中的元素可以为负数。是否有O(n)解决方案?非常感谢任何好的解决方案。
如果您想要最大的连续数字总和,那么类似的方法可能会起作用:
$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。
max_j
max_len