一尘不染

查找数组中元素总数最大的子序列

algorithm

我最近采访了一家公司,他们要求我编写一种算法,该算法可以找到数组中元素总数最大的子序列。数组中的元素可以为负数。是否有O(n)解决方案?非常感谢任何好的解决方案。


阅读 172

收藏
2020-07-28

共1个答案

一尘不染

如果您想要最大的连续数字总和,那么类似的方法可能会起作用:

$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

2020-07-28