c++ - 找到数组中元素总和最大的子序列

标签 c++ c algorithm

我最近采访了一家公司,他们要求我编写一个算法,用于查找数组中元素和最大的子序列。数组中的元素可以是负数。是否有 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

关于c++ - 找到数组中元素总和最大的子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3733251/

相关文章:

C内存分配,释放后覆盖

c - 如何在c中的函数中动态分配内存?

c++ - 按下按钮时增加枚举值

离散体相交算法

c++ - 在没有动态内存的世界中我需要虚拟析构函数吗?

C++ 类到 Void 指针,数据丢失?

c++ - 排序函数,它采用指向接口(interface)类的指针 vector

c++ - Variadic 模板行为怪异

java - 如何使用二进制搜索找到将值插入有序数组的位置?

r - 绘图包括一个分类变量和两个数字变量