程序以查找两个非重叠子列表的长度之和,其和在Python中给出

假设我们有一个称为nums的数字列表,另一个值为k,我们必须在nums中找到两个总和为k的不重叠子列表,并且必须找到它们的长度之和。当可能的子列表超过两个时,我们必须找到两个最小的子列表的长度之和。如果找不到答案,则返回-1。

因此,如果输入像nums = [7,10,-2,-1,4,3] k = 7,那么输出将是3,因为我们选择了[7]和[4,3]这样的子列表。我们没有选择[10,-2,-1],因为它更长。

为了解决这个问题,我们将遵循以下步骤-

  • N:= A的大小

  • 前缀:=,大小为N,并用无穷大填充

  • last:=键0 {0:-1}的值为-1的映射

  • s:= 0

  • 对于0到N范围内的i,执行

    • s:= s + A [i]

    • prefix [i]:= i-last [s-target],如果未找到则设置-infinity

    • 最后[s]:=我

  • 对于1到N范围内的i

    • prefix [i]:=前缀[i],前缀[i-1]的最小值

  • 后缀:=大小N,并用无穷大填充

  • last:=键0 {0:N}的值为N的映射

  • s:= 0

  • 对于范围在N -1至-1的i,减1,

    • s:= s + A [i]

    • 后缀[i]:= last [s −目标](如果未找到,设置为无穷大)− i

    • 最后[s]:=我

  • 对于范围为N − 2至-1的i,减小1,

    • 后缀[i]:=后缀[i]和后缀[i +1]的最小值

  • ans:=范围0到N − 1中每个i的最小前缀[i] +后缀[i + 1]

  • 如果ans <无穷大则返回ans否则为-1

让我们看下面的实现以更好地理解-

示例

class Solution:
   def solve(self, A, target):
      INF = float("inf")
      N = len(A)
      prefix = [INF] * N
      last = {0: −1}
      s = 0
      for i in range(N):
         s += A[i]
         prefix[i] = i − last.get(s − target, −INF)
         last[s] = i
      for i in range(1, N):
         prefix[i] = min(prefix[i], prefix[i − 1])
      suffix = [INF] * N
      last = {0: N}
      s = 0
      for i in range(N − 1, −1, −1):
         s += A[i]
         suffix[i] = last.get(s − target, INF) − i
         last[s] = i
      for i in range(N − 2, −1, −1):
         suffix[i] = min(suffix[i], suffix[i + 1])
      ans = min(prefix[i] + suffix[i + 1] for i in range(N − 1))
      return ans if ans < INF else −1
ob = Solution()nums = [7, 10, −2, −1, 4, 3]
k = 7
print(ob.solve(nums, k))

输入值

[7, 10, −2, −1, 4, 3], 7

输出结果

3