最大连续子数组(元素数量最多)
Maximum contiguous sub-array (With most number of elements)
给定一个自然数数组和另一个自然数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 (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
最大的点
这似乎是最大子数组问题的上限版本:http://en.wikipedia.org/wiki/Maximum_subarray_problem我想你可以从现有的算法中找到灵感。
相关文章:
- 我应该如何表示我拥有的连续元素序列?
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 结构化绑定,无需复制即可获取子向量的连续元素
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- C++指向连续矢量元素的指针是矛盾的
- 减去连续的集元素
- 如何比较C 列表中的两个连续元素
- 连续单个元素的敏感变量
- 将解决方案打印为数组中非连续元素的最大总和
- AVX2 根据条件将连续元素扩展到稀疏向量?(如AVX512 VP扩展)
- 我如何连续地找到“占领”C 数组中的元素
- 是否有任何方法可以比较C 中的STD ::的两个连续元素
- 在C 中添加连续的向量元素组的最快方法
- 如何在c++中增加向量中k个连续元素的值
- C++用于将函数应用于连续元素的算法
- 阵列中连续元素的总和C
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 返回连续数字的逻辑假设数组包含元素 1,9,2,3,4,9,6,7,8,那么它应该返回 2,3,4,6,7,8
- 从数组中每 3 个连续选择元素并使用函数进行比较