Cho hai danh sách l1 và l2. Lặp lại phép toán: chọn một dãy con liên tiếp, thay thế toàn bộ dãy con bằng tổng của nó. Tìm độ dài lớn nhất có thể của danh sách kết quả sau khi làm cho hai danh sách giống nhau. Nếu không thể, trả về -1.
Ví dụ: l1 = [1,4,7,1,2,10], l2 = [5,6,1,3,10] → 4 (ghép thành [5,7,3,10]).
Quy trình giải quyết (Two Pointers từ cuối)
- Khởi tạo
i = len(l1)-1,j = len(l2)-1,res = 0. - Trong khi
i >= 0vàj >= 0:- Nếu
l1[i] == l2[j]: tăngres, giảmi,j. - Nếu
l1[i] < l2[j]: gộpl1[i]vàol1[i-1](nếu có), giảmi. - Nếu
l1[i] > l2[j]: gộpl2[j]vàol2[j-1](nếu có), giảmj.
- Nếu
- Nếu cả
ivàjđều về -1, trả vềres, ngược lại -1.
Ví dụ mã nguồn
class Solution:
def solve(self, l1, l2):
i, j, res = len(l1) - 1, len(l2) - 1, 0
while i >= 0 and j >= 0:
if l1[i] == l2[j]:
res, i, j = res + 1, i - 1, j - 1
elif l1[i] < l2[j]:
if i > 0:
l1[i - 1] += l1[i]
i -= 1
elif l1[i] > l2[j]:
if j > 0:
l2[j - 1] += l2[j]
j -= 1
return res if i == -1 and j == -1 else -1
ob = Solution()
l1 = [1, 4, 7, 1, 2, 10]
l2 = [5, 6, 1, 3, 10]
print(ob.solve(l1, l2)) # Output: 4
Đầu vào
[1, 4, 7, 1, 2, 10], [5, 6, 1, 3, 10]
Đầu ra
4