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