用Python编写程序以查找其总和至少为目标值的最小子列表的大小
假设我们有一个称为nums的数字列表和一个称为目标的另一个输入,则我们必须找到长度最短的子列表,其总和值与目标值相同或更大。如果没有这样的子列表,则返回-1。
因此,如果输入是nums = [2, 11,-4, 17, 4],目标= 19,则输出将为2,因为我们可以选择[17,4]以获得至少19的总和。
要解决这个问题,我们将按照以下步骤执行-
- ps:一个只有一个元素0的列表
-
对于nums中的每个num,执行以下操作
- 将(ps的最后一个元素+ num)插入ps之后
-
如果num≥目标,则
- 返回1
- min_size:inf
-
q:[0]
-
j:0
-
对于ps的范围从1到size的i,执行以下操作:
- j = j和q的大小-1的最小值
- 当j
- min_size = min(min_size和(i-q[j]))
-
j = j + 1
-
当q存在且ps[i] <= ps [q的最后一个元素]时,执行以下操作:
-
从q中删除最后一个元素
-
在q的末尾插入i
- j = j和q的大小-1的最小值
-
如果min_size
示例
让我们查看以下实现以更好地理解-
class Solution:
def solve(self, nums, target):
ps = [0]
for num in nums:
ps += [ps[-1] + num]
if num >= target:
return 1
min_size = float("inf")
q = [0]
j = 0
for i in range(1, len(ps)):
j = min(j, len(q) - 1)
while j < len(q) and ps[i] - ps[q[j]] >= target:
min_size =min(min_size, i - q[j])
j += 1
while q and ps[i] <= ps[q[-1]]:
q.pop()
q.append(i)
return min_size if min_size < float("inf") else -1
ob = Solution()
nums = [2, 11, -4, 17, 4]
target = 19
print(ob.solve(nums, target))
输入
[2, 11,-4, 17, 4],19
输出
2