สมมติว่าเรามีอาร์เรย์ของ arr และเป้าหมายค่าอื่น เราต้องหาอาร์เรย์ย่อยที่ไม่ทับซ้อนกันสองอาร์เรย์ของ arr โดยที่แต่ละอาร์เรย์มีผลรวมเท่ากับเป้าหมาย หากมีหลายคำตอบ เราก็ต้องหาคำตอบโดยที่ผลรวมของความยาวของอาร์เรย์ย่อยทั้งสองมีค่าน้อยที่สุด เราต้องหาผลรวมต่ำสุดของความยาวของอาร์เรย์ย่อยที่จำเป็นทั้งสอง หากไม่มีอาร์เรย์ย่อยดังกล่าว ให้คืนค่า -1
ดังนั้น ถ้าอินพุตเป็นเหมือน arr =[5,2,6,3,2,5] เป้าหมาย =5 ผลลัพธ์จะเป็น 2 มีอาร์เรย์ย่อยสามชุดที่มีผลรวม 5 คือ [5], [3,2 ] และ [5] ตอนนี้มีเพียง 2 ตัวเท่านั้นที่มีขนาดเล็กที่สุด
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ตอบ :=อินฟินิตี้
-
ดีที่สุด :=สร้างอาร์เรย์ที่มีขนาดเท่ากับ arr และเติมอินฟินิตี้
-
คำนำหน้า :=0
-
ล่าสุด :=แผนที่ที่เก็บ -1 สำหรับคีย์ 0
-
สำหรับแต่ละดัชนี i และค่า x ของ arr ทำ
-
คำนำหน้า :=คำนำหน้า + x
-
ถ้า (คำนำหน้า - เป้าหมาย) มีอยู่ในเวอร์ชันล่าสุดแล้ว
-
ii :=ล่าสุด[คำนำหน้า - เป้าหมาย]
-
ถ้า ii>=0 แล้ว
-
ans :=ขั้นต่ำของ ans และ (i - ii + best[ii])
-
-
ดีที่สุด[i] :=i - ii
-
-
ถ้าฉันไม่เป็นศูนย์แล้ว
-
ล่าสุด[คำนำหน้า] :=ฉัน
-
-
-
ส่งคืน ans if ans <999999 มิฉะนั้น -1
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
def solve(arr, target): ans = 999999 best = [999999]*len(arr) prefix = 0 latest = {0: -1} for i, x in enumerate(arr): prefix += x if prefix - target in latest: ii = latest[prefix - target] if ii >= 0: ans = min(ans, i - ii + best[ii]) best[i] = i - ii if i: best[i] = min(best[i-1], best[i]) latest[prefix] = i return ans if ans < 999999 else -1 arr = [5,2,6,3,2,5] target = 5 print(solve(arr, target))
อินพุต
[5,2,6,3,2,5], 5
ผลลัพธ์
2