สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และอีกค่าหนึ่งคือ k เราต้องหารายการย่อยที่ไม่ทับซ้อนกันสองรายการใน num ซึ่งมีผลรวมเป็น k และเราต้องหาผลรวมของความยาว เมื่อมีรายการย่อยที่เป็นไปได้มากกว่าสองรายการ เราต้องหาผลรวมของความยาวของรายการย่อยที่เล็กที่สุดสองรายการ หากเราหาคำตอบไม่ได้ ให้คืนค่า -1
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[7, 10, −2, −1, 4, 3] k =7 ผลลัพธ์จะเป็น 3 ในขณะที่เราเลือกรายการย่อยเช่น [7] และ [4, 3] . เราไม่ได้เลือก [10, −2, −1] เพราะมันยาวกว่า
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
N :=ขนาด A
-
คำนำหน้า :=ของขนาด N และเติมอินฟินิตี้
-
สุดท้าย :=แผนที่ที่มีค่า -1 สำหรับคีย์ 0 {0:-1}
-
s :=0
-
สำหรับผมอยู่ในช่วง 0 ถึง N ทำ
-
s :=s + A[i]
-
คำนำหน้า[i] :=i − Last[s − target] หากไม่พบ set −infinity
-
ล่าสุด[s] :=i
-
-
สำหรับผมอยู่ในช่วง 1 ถึง N ทำ
-
คำนำหน้า[i] :=คำนำหน้าขั้นต่ำ[i] คำนำหน้า[i − 1]
-
-
คำต่อท้าย :=ขนาด N และเติมอินฟินิตี้
-
สุดท้าย :=แผนที่ที่มีค่า N สำหรับคีย์ 0 {0:N}
-
s :=0
-
สำหรับฉันอยู่ในช่วง N − 1 ถึง -1 ลดลง 1 ทำ
-
s :=s + A[i]
-
suffix[i] :=last[s − target] (หากไม่พบ set infinity) − i
-
ล่าสุด[s] :=i
-
-
สำหรับฉันอยู่ในช่วง N − 2 ถึง -1 ลดลง 1 ทำ
-
suffix[i] :=ขั้นต่ำของ suffix[i] และ suffix[i + 1]
-
-
ans :=ขั้นต่ำของคำนำหน้า[i] + suffix[i + 1] สำหรับแต่ละ i ในช่วง 0 ถึง N − 1
-
ส่งคืน ans if ans
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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