给定一个自然数和另一个自然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)操作来做.但是,我正在寻找这个问题的线性时间解决方案.有任何想法吗?
最佳答案 应该可以用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;
}
}
因此,基本上,它沿着数组移动一个滑动窗口,并记录结束 – 开始最大的点.