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.
#array · Tất cả bài viết
Series
Thẻ
- #leetcode 50
- #array 13
- #dfs 11
- #recursion 10
- #bfs 9
- #dynamic-programming 9
- #arrays 7
- #hash-table 7
- #trees 7
- #binary-search 6
- #two-pointers 6
- #string 5
- #backtracking 4
- #dp 4
- #graphs 4
- #greedy 4
- #matrix 4
- #sliding-window 4
- #hash-map 3
- #heap-priority-queue 3
- #linked-list 3
- #binary-search-tree 2
- #heap 2
- #math 2
- #memoization 2
- #priority-queue 2
- #sorting 2
- #stack 2
- #strings 2
- #binary-tree 1
- #bit-manipulation 1
- #bucket-sort 1
- #counting 1
- #cycle-detection 1
- #divide-and-conquer 1
- #geometry 1
- #kadane 1
- #multi-source-bfs 1
- #prefix-sum 1
- #quickselect 1
- #simulation 1
- #string-matching 1
- #topological-sort 1
- #union-find 1
01
Theo Dõi Cả Min Lẫn Max: Tại Sao Bài Tích Lớn Nhất Phá Vỡ Thuật Toán Kadane Thông Thường
LeetCode 152 trông y chang Maximum Subarray cho đến khi một số âm xuất hiện và lật ngược tất cả. Đi qua brute force và DP hai trạng thái xử lý đảo dấu — cùng trace đầy đủ, phân tích edge case, và mental model bạn mang theo cho những bài sau.14 thg 6, 2026 · 8 phút đọc · #00052
02
Phần tử lớn thứ K: ba cách tránh phải sort toàn bộ mảng
Tìm phần tử lớn thứ K trong mảng trông đơn giản — cho đến khi bạn gặp trường hợp sort quá chậm hoặc dữ liệu đến dạng stream. Min heap và QuickSelect giải quyết hai phiên bản khác nhau của vấn đề đó, và hiểu khi nào dùng cái nào quan trọng hơn việc thuộc lòng cả hai.14 thg 6, 2026 · 13 phút đọc · #00037
03
Permutations: xây dựng mọi thứ tự bằng backtracking
LeetCode 46 là bài nhập môn backtracking rõ ràng nhất — ba cách tiếp cận từ một dòng lệnh thư viện đến swap tại chỗ, mỗi cách để lộ thêm một góc nhìn về cách suy nghĩ khi giải bài toán liệt kê.14 thg 6, 2026 · 12 phút đọc · #00043
04
Subsets: ba cách xây dựng power set
LeetCode 78 có ba lời giải thực sự khác nhau — bit manipulation, backtracking, và iterative expansion — và hiểu cả ba mới thấy vì sao 'sinh tất cả các tập con' lại là bài backtracking kinh điển đầu tiên cần nắm.14 thg 6, 2026 · 11 phút đọc · #00041
05
Combination Sum: backtracking với việc dùng lại phần tử
LeetCode 39 trông như một bài backtracking thông thường, nhưng một quy tắc thay đổi toàn bộ cách kiểm soát tìm kiếm: bạn được phép chọn cùng một số nhiều lần tùy thích.14 thg 6, 2026 · 11 phút đọc · #00042
06
Find Minimum in Rotated Sorted Array: nửa nào được sắp xếp?
Mảng được sắp xếp, sau đó xoay — phá vỡ bất biến binary search đơn giản. Cách sửa: so sánh mid với biên phải. Nếu mid nhỏ hơn right, minimum nằm ở nửa trái (bao gồm mid); nếu không thì nằm ở nửa phải (không bao gồm mid).13 thg 6, 2026 · 12 phút đọc · #00025
07
Best Time to Buy and Sell Stock: theo dõi minimum đang chạy
Bạn muốn mua thấp bán cao, nhưng chỉ có thể bán sau khi mua. Giải pháp O(n) theo dõi giá thấp nhất đã thấy cho đến nay và tính profit tại mỗi bước — một lần duyệt duy nhất mà framing sliding window làm rõ ràng.13 thg 6, 2026 · 10 phút đọc · #00017
08
Trapping Rain Water: từ O(n) space xuống O(1) với two pointers
Brute force thì rõ ràng. Cách dùng prefix/suffix array thì gọn. Two-pointer solution mới là nơi thú vị — bạn có thể loại bỏ hoàn toàn các mảng phụ bằng cách nhận ra rằng bạn chỉ cần running max từ phía nào ngắn hơn.13 thg 6, 2026 · 16 phút đọc · #00016
09
Search in Rotated Sorted Array: hai nửa đã sắp xếp, một điều kiện thêm
Sau khi xoay, ít nhất một trong hai nửa xung quanh mid luôn được sắp xếp. Đó là bất biến giữ cho binary search hoạt động. Bạn chỉ cần một kiểm tra thêm để biết nửa nào được sắp xếp, và sau đó target có trong nó không.13 thg 6, 2026 · 12 phút đọc · #00026
10
Two Sum II: tại sao thứ tự đã sắp xếp làm two pointers hoạt động
Input đã được sắp xếp không phải ngẫu nhiên — đó là hợp đồng mà cách tiếp cận two-pointer dựa vào. Khi bạn biết mảng đã được sắp xếp, bạn có thể đặt con trỏ ở hai đầu và di chuyển chúng có mục đích: quá lớn thì thu nhỏ phải; quá nhỏ thì mở rộng trái.13 thg 6, 2026 · 12 phút đọc · #00013
11
Binary Search: bãi mìn off-by-one
Binary search là một trong những thuật toán mà mọi người nghĩ rằng họ hiểu cho đến khi phải implement từ đầu. Logic là bốn dòng. Phần khó là các điều kiện biên — dùng lo <= hi hay lo < hi, và mid đi trái hay phải khi bỏ lỡ.13 thg 6, 2026 · 15 phút đọc · #00023
12
3Sum: two pointers bên trong một vòng lặp đã sắp xếp
3Sum đưa Two Sum II lên một cấp: cố định một phần tử, sau đó chạy Two Sum II trên phần còn lại. Sắp xếp trước cho phép bạn bỏ qua các phần tử trùng lặp một cách gọn gàng — đây là phần khó mà hầu hết các cách implement hay sai.13 thg 6, 2026 · 13 phút đọc · #00014
13
Container With Most Water: tại sao luôn di chuyển cạnh ngắn hơn
Lý luận greedy là thứ làm cho two-pointer đúng ở đây — không chỉ là nhanh. Di chuyển cạnh cao hơn chỉ có thể làm mọi thứ tệ hơn; di chuyển cạnh ngắn hơn là cách duy nhất để có thể cải thiện. Lý luận đó chính là toàn bộ solution.13 thg 6, 2026 · 13 phút đọc · #00015
Đô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.