用Python编写程序以查找其总和至少为目标值的最小子列表的大小

用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

  • 如果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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程