【问题标题】:find longest subsequence with non-negative sum找到具有非负总和的最长子序列
【发布时间】:2014-06-27 12:24:50
【问题描述】:

假设我们有一个包含 n 个实数的数组。我们想在数组中找到最长的连续子序列,它的和大于或等于零。

必须在线性时间内完成。

我们实际上不知道如何开始回答这个问题。

提前致谢。

【问题讨论】:

标签: algorithm subsequence


【解决方案1】:

为此,创建一个子序列(这里用ibegiend 和长度len 指定)并基本上沿着序列前进,在末尾扩展子序列或在开头收缩它以保持>0 .由于内部循环受到当前序列长度的限制,它仍然是 O(N)。

var ibeg = 0;
var iend = 0;
var len = 0;
var best_len = -1, best_ibeg = 0, best_iend = 0;

var acc = 0;
var i = 0;
var N = length(sequence);
while i<N
   acc += sequence(i);
   len++;
   iend++;
   if acc>0
      if len>best_len
          best_len = len;
          best_ibeg = ibeg;
          best_iend = iend;
      end
   else
      while ibeg<=iend
          acc -= sequence(ibeg);
          ibeg++;
          if acc>0, break; end
      end
   end
end

那么best_len 将是最长序列的长度,best_ibegbest_iend 将分别是它的开始和结束位置。

【讨论】:

  • 如果我找到了一个好的连续子序列,然后我又找到了另一个。也许将它们加在一起会更好
  • 如果您将两个连续但独立的子序列加在一起,结果将不连续,因此根据我了解您的问题,这不是您可以接受的答案。
  • 这将是因为也许 id 宁愿将它们都添加以及它们之间的坏部分......
  • @user76508 是的,我认为基本上你所说的是上述算法只会找到“局部最大值”并且可能会错过全局最大值。我想你是对的。但也许有办法修改它以适应这种情况,如果我想到一个,我会发布它,目前,以上至少是一个开始。
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 2015-12-10
相关资源
最近更新 更多