BÀI VIẾT
Ghi chép về xây dựng và vận hành hệ thống
Bài kỹ thuật — kiến trúc, bảo mật, và đôi khi là chuyện chiến trường.
#design · Tất cả bài viết
Series
Thẻ
- #leetcode 50
- #dfs 17
- #recursion 16
- #bfs 10
- #trees 10
- #two-pointers 9
- #linked-list 8
- #backtracking 7
- #graphs 7
- #array 6
- #hash-map 6
- #heap-priority-queue 6
- #design 5
- #dynamic-programming 5
- #matrix 5
- #stack 5
- #cycle-detection 4
- #greedy 4
- #binary-search 3
- #binary-search-tree 3
- #binary-tree 3
- #divide-and-conquer 3
- #hard 3
- #monotonic-stack 3
- #sorting 3
- #string 3
- #arrays 2
- #data-stream 2
- #data-structures 2
- #dp 2
- #hash-table 2
- #in-place 2
- #math 2
- #priority-queue 2
- #simulation 2
- #sliding-window 2
- #topological-sort 2
- #arrays-hashing 1
- #bit-manipulation 1
- #combinatorics 1
- #constraint-satisfaction 1
- #constraint-validation 1
- #counting 1
- #depth-first-search 1
- #dummy-node 1
- #feasibility 1
- #flood-fill 1
- #gap-technique 1
- #geometry 1
- #hash-set 1
- #heap 1
- #kadane 1
- #level-order 1
- #memoization 1
- #monotonic 1
- #monotonic-deque 1
- #next-greater-element 1
- #optimization 1
- #palindrome 1
- #post-order 1
- #queue 1
- #quickselect 1
- #strings 1
- #two-pass 1
- #two-stacks 1
- #union-find 1
01
Min Stack: theo dõi phần tử nhỏ nhất mà không cần quét lại
Mỗi lần gọi getMin() phải trả về minimum hiện tại trong O(1). Bí quyết không phải là tính nó theo yêu cầu — mà là bảo toàn nó qua từng push và pop bằng trạng thái phụ di chuyển cùng stack. Có hai cách sạch sẽ để lưu trạng thái đó, và chúng chỉ khác nhau ở chỗ bạn đặt nó.14 thg 6, 2026 · 13 phút đọc · #00056
02
Kth Largest trong data stream: tại sao min-heap kích thước k là ranh giới đúng
Theo dõi phần tử lớn thứ k trong một stream không giới hạn trông như cần lưu trữ mọi thứ. Min-heap kích thước k chứng minh bạn chỉ cần giữ k phần tử, và mỗi lần gọi add chỉ tốn O(log k) thay vì O(n log n). Bài này phân tích cả hai approach — brute force sắp xếp mỗi lần thêm và heap solution — kèm trace tay, phân tích edge case, và insight thiết kế về vì sao root của heap chính xác là câu trả lời.14 thg 6, 2026 · 13 phút đọc · #00080
03
LRU Cache: vì sao eviction O(1) đòi hỏi hai cấu trúc dữ liệu cùng lúc
LeetCode 146 buộc bạn phải suy nghĩ xem O(1) eviction thực sự đòi hỏi gì. Cách tiếp cận naive dùng array thất bại ở cả get lẫn put. Giải pháp chuẩn sản xuất — hash map trỏ vào doubly linked list với sentinel node — là ví dụ điển hình về việc kết hợp hai cấu trúc để mỗi cái bù đắp điểm yếu của cái kia. Bài viết này đi qua cả hai approach, trace state machine từng bước, và giải thích tại sao sentinel pattern không phải tùy chọn.14 thg 6, 2026 · 14 phút đọc · #00069
04
Find Median from Data Stream: tại sao hai heap đánh bại mảng đã sắp xếp
Streaming median là bài toán thiết kế không kém phần thuật toán. Bạn có thể sort mỗi lần query, duy trì sorted list và chèn theo vị trí, hoặc tách số thành hai heap luôn lộ ra phần tử giữa. Mỗi lựa chọn đánh đổi chi phí addNum với chi phí findMedian theo cách khác nhau — và chỉ có heap mới đạt O(log n) cho cả hai.14 thg 6, 2026 · 13 phút đọc · #00082
05
Design Twitter: merge k sorted timeline bằng heap
LeetCode 355 trông như một bài systems design nhưng thực chất là bài toán kết hợp cấu trúc dữ liệu. Brute force scan hoạt động với input nhỏ; heap-based approach cho thấy pattern 'merge k sorted lists' tạo ra news feed trong O(F log F) bất kể tổng số tweet. Cả hai approach đều được trace đầy đủ, cùng edge case và trade-off reasoning cần thiết trong phỏng vấn.14 thg 6, 2026 · 13 phút đọc · #00081
Đôi dòng ghi chép về những gì tôi đang xây
Nhận email khi tôi đăng bài mới — các bài kỹ thuật, không spam. Hủy đăng ký bất cứ lúc nào.