假设我们有一个称为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