【问题标题】:Maximum contiguous sub-array (With most number of elements)最大连续子数组(元素数量最多)
【发布时间】:2013-03-04 17:02:45
【问题描述】:

给定一个自然数数组和一个自然数T,如何找到总和小于或等于T但该子数组中元素个数最大化的连续子数组?

例如,如果给定的数组是:

{3, 1, 2, 1, 1}T = 5。那么最大的连续子数组是{1, 2, 1, 1},因为它将包含5个元素并且总和等于5。

另一个例子:{10,1,1,1,1,3,6,7}T = 8。那么最大连续子数组为${1,1,1,1,3}$

我可以通过O(n^2) 操作来做到这一点。但是,我正在寻找这个问题的线性时间解决方案。有什么想法吗?

【问题讨论】:

标签: c++ c algorithm math


【解决方案1】:

用 O(n) 应该可以做到这一点。我没有对此进行测试,但看起来还可以:

int start = 0, end = 0;
int beststart = 0, bestend = 0;
int sum = array[0];

while (end + 1 < arraysize) {
  if (array[end + 1] + sum <= T)
    sum += array[end++];
  else
    sum -= array[start++];
  if ((end - start) > (bestend - beststart)) {
    beststart = start;
    bestend = end;
  }
}

所以,基本上,它会沿着数组移动一个滑动窗口并记录end - start 最大的点。

【讨论】:

  • 我认为你需要再次检查` if ((end - start) > (bestend - beststart)) { beststart = start;最好的=结束; }` 在最后。
  • @Quixotic:现在好点了吗?
【解决方案2】:

这似乎是最大子数组问题的上限版本:http://en.wikipedia.org/wiki/Maximum_subarray_problem 我想你可以从现有算法中找到灵感。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2021-01-21
    • 2020-01-22
    • 2015-10-31
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多