Cho mảng points chứa tọa độ (xi, yi) đã sắp xếp theo x tăng dần. Cho giá trị k. Tìm max của y_i + y_j + |x_i - x_j| với điều kiện |x_i - x_j| <= k và i < j.
Ví dụ: points = [[2,4],[3,1],[6,11],[7,-9]], k = 1 → kết quả 6 (cặp (2,4) và (3,1): 4+1+|2-3|=6).
Giải thuật (Hai con trỏ)
- Khởi tạo
left = 0,right = 1,max_value = -inf. - Trong khi
right < len(points):- Lấy
(xl, yl) = points[left],(xr, yr) = points[right]. diff = abs(xr - xl).- Nếu
left == right:right += 1. - Ngược lại nếu
diff <= k:m = yl + yr + diff, cập nhậtmax_value.- Nếu
yl >= yr - diff:right += 1; ngược lại:left += 1.
- Ngược lại:
left += 1.
- Lấy
- Trả về
max_value.
Ví dụ minh họa
def solve(points, k):
left, right = 0, 1
max_value = float('-inf')
while right < len(points):
xl, yl = points[left]
xr, yr = points[right]
diff = abs(xr - xl)
if left == right:
right += 1
elif diff <= k:
m = yl + yr + diff
max_value = max(max_value, m)
if yl >= yr - diff:
right += 1
else:
left += 1
else:
left += 1
return max_value
points = [[2,4],[3,1],[6,11],[7,-9]]
k = 1
print(solve(points, k))
Đầu vào
[[2,4],[3,1],[6,11],[7,-9]], 1
Đầu ra
6