ปัญหา
อาร์เรย์ nums และค่า x หนึ่งการดำเนินการ: ลบสมาชิกซ้ายสุดหรือขวาสุด แล้วลบค่าออกจาก x หาจำนวนการดำเนินการน้อยที่สุดทำให้ x=0 ถ้าไม่ได้คืน -1
ตัวอย่าง
nums=[4,2,9,1,4,2,3], x=9 → ผลลัพธ์ 3 (ลบซ้าย 4 → x=5, ลบขวา 3 → x=2, ลบซ้าย 2 หรือขวา 2 → x=0)
ขั้นตอนการแก้ปัญหา
n := len(nums)leftMap := {0: -1},left := 0- สร้าง prefix sum map:
leftMap[left] = i(เก็บดัชนีแรกที่เจอ prefix sum นั้น) right := 0, ans := n+1- วน
iจาก n ถึง 0 (ย้อนกลับ):- ถ้า
i < n:right += nums[i] left := x - right- ถ้า
left in leftMap:ans = min(ans, leftMap[left] + 1 + n - i)
- ถ้า
- ถ้า
ans == n+1: คืน -1 มิฉะนั้น คืนans
การนำไปใช้งาน (Python)
def solve(nums, x):
n = len(nums)
leftMap = {0: -1}
left = 0
for i in range(n):
left += nums[i]
if left not in leftMap:
leftMap[left] = i
right = 0
ans = n + 1
for i in range(n, -1, -1):
if i < n:
right += nums[i]
left = x - right
if left in leftMap:
ans = min(ans, leftMap[left] + 1 + n - i)
if ans == n + 1:
return -1
return ans
nums = [4,2,9,1,4,2,3]
x = 9
print(solve(nums, x))
อินพุต
[4,2,9,1,4,2,3], 9
เอาต์พุต
3