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