Giả sử chúng ta có một số mảng và một mục tiêu giá trị khác. Chúng tôi muốn chọn một dãy con gồm các số sao cho tổng các phần tử của nó là gần mục tiêu nhất. Vì vậy, nói cách khác, nếu tổng các phần tử của dãy con là s, thì chúng ta muốn giảm thiểu sự khác biệt tuyệt đối | s - mục tiêu |.
Vì vậy, chúng ta phải tìm giá trị nhỏ nhất có thể có của | s - goal |. Vì vậy, nếu đầu vào là nums =[8, -8,16, -1] goal =-3, thì đầu ra sẽ là 2 vì chọn dãy con [8, -8, -1], với tổng là -1. Sự khác biệt tuyệt đối là | -1 - (-3) | =abs (2) =2, đây là mức tối thiểu.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
n:=kích thước của nums
-
sắp xếp các số dựa trên giá trị -ve sau khi nhận các giá trị tuyệt đối của x
-
neg:=tạo một mảng có kích thước n + 1 và điền bằng 0
-
pos:=tạo một mảng có kích thước n + 1 và điền bằng 0
-
đối với tôi trong phạm vi n-1 đến 0, giảm 1, thực hiện
-
nếu nums [i] <0, thì
-
neg [i]:=neg [i + 1] + nums [i]
-
pos [i]:=pos [i + 1]
-
-
nếu không,
-
pos [i]:=pos [i + 1] + nums [i]
-
neg [i]:=neg [i + 1]
-
-
-
ans:=| mục tiêu |
-
s:=a new set ans insert 0 vào it
-
Xác định một kiểm tra hàm (). Điều này sẽ mất a, b
-
nếu b
-
trả về Sai
-
-
trả về True
-
Từ phương thức chính, hãy thực hiện như sau
-
đối với tôi trong phạm vi từ 0 đến n - 1, hãy thực hiện
-
sl:=danh sách x cho tất cả x trong s khi kiểm tra (x + neg [i], x + pos [i] is true]
-
nếu kích thước của sl bằng 0, thì
-
đi ra từ vòng lặp
-
-
s:=một tập hợp mới từ sl
-
đối với mỗi x trong sl, thực hiện
-
y:=x + nums [i]
-
nếu | y - mục tiêu |
-
ans:=| y - mục tiêu |
-
-
nếu ans giống 0 thì
-
trả về 0
-
-
chèn y vào s
-
-
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn
from collections import Counter def solve(nums, goal): n = len(nums) nums.sort(key=lambda x: -abs(x)) neg = [0 for _ in range(n+1)] pos = [0 for _ in range(n+1)] for i in range(n-1, -1, -1): if nums[i] < 0: neg[i] = neg[i+1] + nums[i] pos[i] = pos[i+1] else: pos[i] = pos[i+1] + nums[i] neg[i] = neg[i+1] ans = abs(goal) s = set([0]) def check(a, b): if b < goal - ans or goal + ans < a: return False return True for i in range(n): sl = [x for x in s if check(x+neg[i], x+pos[i])] if len(sl) == 0: break s = set(sl) for x in sl: y = x + nums[i] if abs(y - goal) < ans: ans = abs(y - goal) if ans == 0: return 0 s.add(y) return ans nums = [8,-8,16,-1] goal = -3 print(solve(nums, goal))
Đầu vào
[0,1,2,3,4], [[3,1],[1,3],[5,6]]
Đầu ra
2