Python程式:查詢和為給定值的兩段不相交子列表的長度之和
假設我們有一個名為nums的數字列表和另一個值k,我們必須在nums中找到兩個不相交的子列表,其和為k,並且我們必須找到它們的長度之和。當存在兩個以上可能的子列表時,我們必須找到兩個最短子列表的長度之和。如果找不到答案,則返回-1。
因此,如果輸入類似於nums = [7, 10, -2, -1, 4, 3] k = 7,則輸出將為3,因為我們選擇子列表[7]和[4, 3]。我們沒有選擇[10, -2, -1],因為這個更長。
為了解決這個問題,我們將遵循以下步驟:
N := A的大小
prefix := 大小為N的陣列,並用無窮大填充
last := 一個鍵值為0時值為-1的對映 {0: -1}
s := 0
對於範圍0到N中的i,執行:
s := s + A[i]
prefix[i] := i - last[s - target],如果找不到則設定為負無窮大
last[s] := i
對於範圍1到N中的i,執行:
prefix[i] := prefix[i] 和 prefix[i - 1] 的最小值
suffix := 大小為N的陣列,並用無窮大填充
last := 一個鍵值為0時值為N的對映 {0: N}
s := 0
對於範圍N - 1到-1中的i(遞減),執行:
s := s + A[i]
suffix[i] := last[s - target] - i (如果找不到則設定為無窮大)
last[s] := i
對於範圍N - 2到-1中的i(遞減),執行:
suffix[i] := suffix[i] 和 suffix[i + 1] 的最小值
ans := 對於範圍0到N - 1中的每個i,prefix[i] + suffix[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