最大连续子阵列(具有最多元素)

时间:2013-03-04 17:02:46

标签: c++ c algorithm math

给定一个自然数的数组和另一个自然数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)操作来完成。但是,我正在寻找这个问题的线性时间解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

应该可以用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最大的点。

答案 1 :(得分:0)

它似乎是Maximum子阵列问题的上限版本:http://en.wikipedia.org/wiki/Maximum_subarray_problem 我想你可以找到现有算法的灵感。