最大连续子数组(元素数量最多)

Posted

技术标签:

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

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

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

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

另一个例子:10,1,1,1,1,3,6,7T = 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 我想你可以从现有算法中找到灵感。

【讨论】:

以上是关于最大连续子数组(元素数量最多)的主要内容,如果未能解决你的问题,请参考以下文章

最多有多少个连续子数组。 n 个唯一编号

最多具有K个元素的最大连续子数组

连续子数组的最大和问题

2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。

leetcode每日一题(2021.5.13)——最大子序扣

2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元