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

bre*_*ett 13 c c++ algorithm

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

Mat*_*hew 16

如果你想要最大的序列数,那么像这样的东西可能会起作用:

$cur = $max = 0;
foreach ($seq as $n)
{
  $cur += $n;
  if ($cur < 0) $cur = 0;
  if ($cur > $max) $max = $cur;
}
Run Code Online (Sandbox Code Playgroud)

这只是我的头脑,但似乎是正确的.(忽略它假定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);
Run Code Online (Sandbox Code Playgroud)

可能有一种更简洁的方法来做到这一点.同样,它具有相同的假设(至少一个正整数).此外,它只找到第一大序列.

编辑:将其更改为使用max_j(独占)而不是max_len.

  • @Kapil D,我的答案非常明确地从说出它回答的内容开始.这是他的采访者想要的吗?我们永远不会知道.他接受了这一点,显然正是他所寻找的.(如果他真的想要一个总和最大的子序列,答案是微不足道的:删除所有负数.) (6认同)
  • 这不是他要找的东西。他要求一个具有最大和的子序列。你给了他最大的连续子序列。和。在子序列中,数字不一定是连续的。 (2认同)

Eya*_*der 14

如果你的意思是增加最长的子序列,请参阅codaddict的答案.

另一方面,如果你的意思是找到具有最大总和子数组(仅对负值有意义),那么有一个优雅,动态的编程风格线性时间解决方案:

http://en.wikipedia.org/wiki/Maximum_subarray_problem