【问题标题】:Find the minimum set of integers whose sum is greater than a given integer找到总和大于给定整数的最小整数集
【发布时间】:2016-11-05 11:56:13
【问题描述】:

我正在尝试解决以下问题。我以 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,17}=3 个数字

{2,17}=2 个数字

所以,最少 =2 个数字。输出=2。

【问题讨论】:

  • 有没有尝试独立解决这个问题?
  • 我投票结束这个问题,因为 Stack Overflow 不会为你做作业。
  • 我用时间复杂度 O(n^2) 解决了它,但我无法进一步优化它。这个问题可以在 O(n) 的时间复杂度内解决,无需使用额外的数组。
  • 我用...解决它:请展示您的算法(在您的问题中)以及您改进它的尝试。
  • 同时指明整数是否可以为负数。

标签: arrays algorithm time-complexity


【解决方案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)。

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 2017-03-05
    • 1970-01-01
    • 2012-12-29
    • 2021-01-19
    • 2016-04-12
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多