最大连续子数组(元素数量最多)
Posted
技术标签:
【中文标题】最大连续子数组(元素数量最多)【英文标题】: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)
操作来做到这一点。但是,我正在寻找这个问题的线性时间解决方案。有什么想法吗?
【问题讨论】:
对我来说,这似乎是 Knapsack Problem 的一个版本。 【参考方案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 我想你可以从现有算法中找到灵感。
【讨论】:
以上是关于最大连续子数组(元素数量最多)的主要内容,如果未能解决你的问题,请参考以下文章
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。
leetcode每日一题(2021.5.13)——最大子序扣
2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元