Pattern — Two Sum Variants

Khi nào dùng

Bài hỏi “tìm 2 phần tử / cặp / k phần tử có tổng (hiệu, tích) = target” trong array.

Decision tree

Có sorted không?
├─ YES → Two Pointers — O(N), O(1) space
└─ NO  → HashMap — O(N), O(N) space  (mặc định)

Nếu được phép sort & cần extra space → sort + two pointers, .

Variants

BàiLCPattern chính
Two SumLC-1HashMap
Two Sum II — sortedLC #167Two Pointers
3SumLC #15Sort + 3-pointers + skip duplicates
3Sum ClosestLC #16Sort + 3-pointers + min
4SumLC #18Sort + 4-pointers (or 2-pointer + 2 outer loops)
Two Sum III (data structure)LC #170HashMap với multi-set của freq
Two Sum IV (BST)LC #653BST inorder + two pointers
Subarray Sum = KLC #560Prefix sum + HashMap — rất khác!
Continuous Subarray SumLC #523Prefix sum mod K

Pitfalls

  1. Skip duplicates trong 3Sum: while (i < N-1 && nums[i]==nums[i+1]) i++ — SAU khi đã ghi nhận đáp án hợp lệ.
  2. HashMap collision: cần check if (map.has(complement) && map.get(complement) !== i) để không trùng index.
  3. 3Sum không sort: phải dùng Set đúng cách hoặc sẽ duplicate triplets.
  4. Overflow: có thể overflow với int32 — Python/JS không vấn đề, Java/C++ cần long.

Top 5 problems (priority)

  1. LC #1 — Two Sum (HashMap)
  2. LC #167 — Two Sum II Sorted (Two Pointers)
  3. LC #15 — 3Sum (Sort + skip dup)
  4. LC #560 — Subarray Sum K (Prefix + HashMap)
  5. LC #18 — 4Sum (Generalize)

→ Nguồn lý thuyết: 07-Hash-Table, 01-Two-Pointers-Sliding-Window