Chương 2 – Chuyên đề thuật toán (Algorithm Topics)

Ban đầu tôi đã ngây thơ nghĩ rằng: chỉ cần giải hết toàn bộ các bài trên LeetCode là có thể hoàn thành trọn vẹn cuốn sách này.
Nhưng thực tế đã chứng minh đó đúng là… ngây thơ thật.

Bởi vì LeetCode liên tục thêm bài mới mỗi ngày. Có những lúc công việc bận rộn, tiến độ giải bài hoàn toàn không theo kịp tốc độ cập nhật đề. Với tốc độ hiện tại của tôi, mỗi năm chỉ hoàn thành được hơn 500 bài, trong khi LeetCode mỗi năm lại thêm hơn 400 bài mới. Như vậy, để giải hết toàn bộ bài trên LeetCode, ít nhất cũng cần 5–10 năm. Thời gian quá dài.

Vì thế, tôi tự đặt cho mình một mục tiêu nhỏ trước mắt:
👉 Giải xong 500 bài thì bắt đầu viết sách, tổng kết lại kinh nghiệm giải bài trong giai đoạn này và cùng mọi người trao đổi, học hỏi.

Nếu muốn giải hết toàn bộ bài trên LeetCode, xem ra cuốn sách này sẽ phải lặp lại 5–10 phiên bản (mỗi năm một phiên bản).


Trong chương này, tôi sẽ hệ thống lại toàn bộ các chuyên đề mà mình đã giải xong.
Những bài toán có tư duy và cấu trúc (pattern) tương tự nhau sẽ được gom chung lại một chỗ.

Nếu mục tiêu là ôn thi phỏng vấn nhanh, thì với cùng một dạng bài, thực tế chỉ cần làm 2–3 bài tiêu biểu là đủ.
Khi đã rất thành thạo một dạng bài nào đó, việc tiếp tục làm thêm nhiều bài cùng loại thường không mang lại giá trị đáng kể.


Tính đến thời điểm hiện tại, theo quan điểm của tôi, lập trình động (Dynamic Programming – DP) là dạng bài linh hoạt nhất.
Loại bài này không có một template cố định để áp vào, và đó cũng chính là điểm tinh tế, tao nhã của thuật toán.

Thậm chí, tôi cho rằng gọi lập trình động là “nghệ thuật của thuật toán” cũng không hề quá lời.

Bản thân tôi hiện tại vẫn chưa giải xong toàn bộ các bài về DP, mới chỉ làm một phần và vẫn đang tiếp tục học hỏi.


Vì vậy, trong chương này tôi sẽ chia sẻ:

  • Những bài toán mà tôi đã giải qua
  • Các bài có điểm tương đồng về tư duy
  • Cách phân nhóm để dễ học, dễ ôn và dễ áp dụng khi phỏng vấn