Giả sử chúng ta có một danh sách chỉ chứa hai giá trị 1 và -1. Nhiệm vụ là tìm độ dài của dãy con (sublist) dài nhất mà tổng các phần tử bằng 0.
Ví dụ: với đầu vào nums = [1, 1, -1, 1, 1, -1, 1, -1, 1, -1], kết quả là 8, vì dãy con dài nhất là [-1, 1, 1, -1, 1, -1, 1, -1] có tổng bằng 0.
Giải thuật
Chúng ta sử dụng kỹ thuật tiền tố cộng (prefix sum) kết hợp với bảng băm (hash map) để lưu trữ chỉ số đầu tiên xuất hiện của mỗi giá trị tổng tiền tố.
- Khởi tạo
tablelà một từ điển rỗng,cs = 0(tổng tiền tố hiện tại),max_diff = 0(độ dài lớn nhất). - Duyệt qua mảng với chỉ số
itừ 0 đếnlen(nums)-1:- Cập nhật
cs += nums[i]. - Nếu
cs == 0, cập nhậtmax_diff = max(max_diff, i + 1). - Nếu
csđã có trongtable, cập nhậtmax_diff = max(max_diff, i - table[cs]). - Ngược lại, lưu
table[cs] = i(chỉ lưu lần đầu xuất hiện).
- Cập nhật
- Trả về
max_diff.
Mã nguồn Python
class Solution:
def solve(self, nums):
table = {}
cs = 0
max_diff = 0
for i in range(len(nums)):
cs += nums[i]
if cs == 0:
max_diff = max(i + 1, max_diff)
if cs in table:
max_diff = max(max_diff, i - table[cs])
else:
table[cs] = i
return max_diff
ob = Solution()
nums = [1, 1, -1, 1, 1, -1, 1, -1, 1, -1]
print(ob.solve(nums)) # Output: 8
Đầu vào
[1, 1, -1, 1, 1, -1, 1, -1, 1, -1]
Đầu ra
8