Đề xuất các bài LeetCode kinh điển về các cấu trúc dữ liệu thường gặp
Khi làm bài về cấu trúc dữ liệu, không nên chỉ luyện từ Easy đến Hard theo độ khó. Cách vững hơn là phân loại dạng bài theo từng cấu trúc: array tập trung vào index và khoảng, linked list tập trung vào pointer, stack và queue tập trung vào ràng buộc thứ tự, tree và graph tập trung vào traversal, heap tập trung vào priority, hash table tập trung vào định vị nhanh.
Danh sách dưới đây giới hạn trong các bài thường gặp khi phỏng vấn và các bài tiêu biểu cho template. Với mỗi nhóm, hãy làm “bài nhất định phải làm” trước, sau đó mới làm “bài nâng cao”. Sau khi hoàn thành bài, ít nhất hãy ghi lại complexity, trường hợp biên và bài này thuộc template nào.
Cách dùng danh sách bài này
Đừng chỉ ghi nhớ kết luận khi làm bài về cấu trúc dữ liệu. Mỗi khi luyện một nhóm, hãy quay lại tìm hiểu “cách lưu trữ, thao tác cốt lõi, complexity” của cấu trúc tương ứng, rồi mới bắt tay viết bài. Khi đó, nếu interviewer hỏi tiếp về Java Collections, Redis, MySQL index hoặc trường hợp sử dụng của cache, câu trả lời sẽ không chỉ dừng ở mức lời giải.
| Cấu trúc | Nên đọc gì trước | Khi luyện bài cần tập trung vào gì |
|---|---|---|
| Array, linked list, stack, queue | Giải thích chi tiết về linear data structure, Two pointers và sliding window | index, cập nhật pointer, thời điểm push/pop |
| Hash table | Tổng hợp câu hỏi phỏng vấn hash table | thiết kế key, thời điểm cập nhật số đếm, collision và resize |
| Tree và graph | Giải thích chi tiết tree structure, Giải thích chi tiết graph, DFS và BFS | giá trị trả về của đệ quy, visited, thống kê số tầng của BFS |
| Heap và Top K | Giải thích chi tiết heap, Tổng hợp câu hỏi phỏng vấn Top K | kích thước heap, comparator, bối cảnh data stream |
| Trie và union-find | Tổng hợp câu hỏi phỏng vấn Trie prefix tree, Tổng hợp câu hỏi phỏng vấn union-find | cấu trúc node, đánh dấu kết thúc, path compression, kiểm tra connectivity |
| LRU | Tổng hợp câu hỏi phỏng vấn LRU cache | cách hash table và doubly linked list cùng duy trì O(1) |
Array
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Binary search | 704. Binary search | 34. Tìm vị trí đầu tiên và cuối cùng của phần tử trong sorted array | Kiểm tra điều kiện vòng lặp và biên | left <= right, cập nhật biên trái phải |
| Sửa tại chỗ | 26. Xóa phần tử trùng trong sorted array | 80. Xóa phần tử trùng trong sorted array II | Kiểm tra cách dùng two pointers | ý nghĩa slow pointer, thời điểm ghi đè |
| Two pointers | 977. Bình phương các phần tử trong sorted array | 15. Three Sum | Dạng bài array thường gặp | loại trùng sau khi sorting, di chuyển pointer trái phải |
| Prefix sum | 303. Truy vấn tổng theo khoảng - array bất biến | 560. Subarray có tổng bằng K | Điểm bắt đầu của bài subarray | ý nghĩa prefix sum, đếm bằng hash table |
Linked list
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Thao tác cơ bản | 707. Thiết kế linked list | 24. Đổi chỗ từng cặp node trong linked list | Kiểm tra kỹ năng thao tác node | dummy head, thứ tự chèn và xóa |
| Đảo linked list | 206. Đảo linked list | 92. Đảo linked list II | Bài thường gặp khi viết tay | thứ tự cập nhật prev, cur, next |
| Fast-slow pointer | 141. Linked list có chu kỳ | 142. Linked list có chu kỳ II | Câu hỏi thường được hỏi thêm | suy ra điểm gặp nhau và điểm vào cycle |
| Xóa node | 19. Xóa node thứ N tính từ cuối linked list | 61. Xoay linked list | Kiểm tra xử lý biên | độ dài linked list, xóa head node |
Stack và queue
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Mô phỏng cấu trúc | 232. Dùng stack triển khai queue | 225. Dùng queue triển khai stack | Kiểm tra hiểu biết về cấu trúc | vai trò của input stack và output stack |
| Kiểm tra ngoặc | 20. Ngoặc hợp lệ | 394. Decode string | Bài mở đầu về string stack | khi nào push, khi nào pop |
| Monotonic stack | 739. Nhiệt độ hằng ngày | 84. Hình chữ nhật lớn nhất trong histogram | Dạng bài có tần suất xuất hiện trung bình đến cao | stack duy trì thứ tự tăng hay giảm |
| Monotonic queue | 239. Giá trị lớn nhất của sliding window | 862. Subarray ngắn nhất có tổng ít nhất là K | Template thường gặp cho bài Hard | phần tử ở đầu queue hết hạn, duy trì tính đơn điệu ở cuối queue |
Hash table
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Tìm nhanh | 1. Two Sum | 49. Nhóm anagram | Nhập môn hash table | thiết kế key |
| Đếm | 242. Anagram hợp lệ | 347. K phần tử có tần suất cao nhất | Bài thống kê tần suất thường gặp | khi nào chọn đếm bằng array, khi nào dùng Map |
| Prefix sum + hash | 560. Subarray có tổng bằng K | 974. Subarray có tổng chia hết cho K | Dạng bài subarray thường gặp | kiểm tra trước rồi mới thêm, tránh tính cả prefix hiện tại |
| Cấu trúc cache | 146. LRU cache | 460. LFU cache | Bài thiết kế viết tay | cách hash table phối hợp với doubly linked list |
Binary tree
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Traversal | 144. Preorder traversal của binary tree | 102. Level order traversal của binary tree | Nền tảng của bài tree | biên đệ quy, số tầng khi dùng queue |
| Bài toán path | 112. Tổng trên path | 124. Tổng path lớn nhất trong binary tree | DFS thường gặp | tách giá trị trả về và đáp án toàn cục |
| Xây dựng tree | 105. Xây dựng binary tree từ preorder và inorder traversal | 106. Xây dựng binary tree từ inorder và postorder traversal | Kiểm tra phạm vi đệ quy | không viết sai phạm vi index |
| Lowest common ancestor | 236. Lowest common ancestor của binary tree | 235. Lowest common ancestor của binary search tree | Câu hỏi thường gặp | khác biệt giữa cách giải của tree thường và BST |
Graph
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Grid DFS/BFS | 200. Số lượng đảo | 695. Diện tích lớn nhất của đảo | Nhập môn graph search | xử lý vượt biên, đánh dấu visited |
| Topological sort | 207. Course schedule | 210. Course schedule II | Bài về quan hệ phụ thuộc | indegree array, queue |
| Shortest path | 994. Cam bị thối | 127. Word ladder | Ứng dụng BFS theo level | thống kê số bước mỗi level |
| Connectivity | 547. Số lượng tỉnh | 684. Kết nối dư thừa | Điểm bắt đầu của union-find | template find và union |
Heap
| Dạng bài | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Phần tử lớn thứ K | 215. Phần tử lớn thứ K trong array | 703. Phần tử lớn thứ K trong data stream | Top K thường gặp | duy trì kích thước min heap bằng K |
| Thống kê tần suất | 347. K phần tử có tần suất cao nhất | 692. K từ có tần suất cao nhất | Hash table + heap | cách viết comparator |
| Hai heap | 295. Median trong data stream | 480. Median trong sliding window | Bài thiết kế nâng cao | cân bằng max heap và min heap |
Trie và union-find
| Cấu trúc | Bài nhất định phải làm | Bài nâng cao | Giá trị phỏng vấn | Trọng tâm ôn tập |
|---|---|---|---|---|
| Trie | 208. Cài đặt Trie | 211. Thêm và tìm kiếm từ | Bài về tập hợp các string | cấu trúc node, đánh dấu kết thúc |
| Trie + DFS | 212. Word search II | 648. Thay thế từ | Bài có tần suất xuất hiện trung bình đến cao | cắt nhánh theo prefix |
| Union-find | 547. Số lượng tỉnh | 1319. Số thao tác để kết nối network | Template connectivity | path compression |
| Union-find phát hiện cycle | 684. Kết nối dư thừa | 990. Tính thỏa mãn của phương trình bằng nhau | Biến thể thường gặp của bài graph | gộp các phương trình trước, sau đó kiểm tra xung đột |
Điểm bắt đầu của lộ trình ôn tập
Bài viết này chỉ giữ lại danh sách bài liên quan đến cấu trúc dữ liệu. Lộ trình ôn tập 7 ngày và 30 ngày được duy trì thống nhất trong tổng quan ôn tập cấu trúc dữ liệu, tránh lặp lại cùng một kế hoạch giữa bài danh sách và trang tổng quan.
Lời cuối
Nếu nội dung hữu ích với bạn, hãy tiện tay tặng JavaGuide một Star miễn phí để ủng hộ: GitHub | Gitee.
JavaGuide đã được duy trì gần bảy năm, tích lũy 6100+ commit, với sự chung tay hoàn thiện của 620+ contributor. Star, phản hồi và PR của bạn đều là động lực để dự án tiếp tục cập nhật.
Nếu bạn đang chuẩn bị phỏng vấn backend / phát triển ứng dụng AI, có thể tham khảo Knowledge Planet của tôi, bao gồm các project thực tế về backend và AI, tối ưu CV, hỏi đáp 1-1 và tài liệu về các trọng điểm thường gặp, đã được duy trì liên tục sáu năm.
