我试图解决以下问题。我在O(n ^ 2)时间复杂度中解决了这个问题。有没有办法进一步优化它,并通过迭代数组一次将复杂性降低到O(n)?
给定一个n个整数和一个数字S的数组。我需要找到最小的连续整数集合,其总和大于数字S.如果不存在这样的集合,我将打印0。
所需的复杂性: 空间复杂度-O(1) 时间复杂度-O(n)
实施例 -
数组A = {2,5,4,6,3,9,2,17,1}
S = 17
输出= 2
解释 -
可能的解决方案是: -
{2,5,4,6,3} = 2 + 5 + 4 + 6 + 3 = 20(> 18)= 5个数字
{5,4,6,3,9} = 27(> 18)= 5个数字
{4,6,3,9} = 22(> 18)-4个数字
{6,3,9,2} = 20 = 4个数字
{3,9,2,17} = 4个数字
{9,2,1}} = 3个数字
{2,17} = 2个数字
所以,最小= 2个数字。输出= 2。
答案 0 :(得分:1)
假设所有整数都是非负数且 S 为正数,则可以使用以下算法:
使用两个索引,一个用于当前序列的开始,另一个用于结束的位置。当该序列的总和太小时,通过递增第二个索引来扩展序列;如果总和超过 S ,则通过递增第一个索引来跟踪到目前为止它是否是最好的并同时从序列中删除第一个值。
以下是更正式的伪代码中的算法:
n = size(A)
best = n + 1
sum = 0
i = 0
for j = 0 to n - 1:
sum = sum + A[j]
while sum > S:
if j - i + 1 < best:
best = j - i + 1
sum = sum - A[i]
i = i + 1
if best > n:
best = 0
output best
空间复杂度为 O(1),因为涉及4个数值变量(不计算输入数组),表示固定数量的内存。
时间复杂度 O(n),因为内部循环中的语句执行的总次数绝不会超过 n ( i >每次递增,永远不会绕过 j )。