Hai TổngTwo Sum
Hiểu bài
Cho bạn một mảng nums và số nguyên target. Tìm 2 chỉ số i, j (i ≠ j) sao cho nums[i] + nums[j] === target. Trả về cặp chỉ số đó.
Ví dụ:
nums = [2, 7, 11, 15], target = 9
output = [0, 1] // vì nums[0] + nums[1] = 2 + 7 = 9Giả thiết: luôn có đúng 1 lời giải.
Không được dùng cùng phần tử 2 lần.
Xem cách cơ bản (chậm hơn)
O(n²) time, O(1) spacefunction twoSum(nums: number[], target: number): [number, number] | null {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) return [i, j]
}
}
return null
}Hai vòng lặp lồng nhau kiểm tra tất cả cặp phần tử.
Với n=10⁴ → 10⁸ phép so sánh, vượt giới hạn thời gian cho phép.
Lời giải tối ưu
O(n) time, O(n) spacefunction twoSum(nums: number[], target: number): [number, number] | null {
const seen = new Map<number, number>() // value → index
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i]
if (seen.has(complement)) return [seen.get(complement)!, i]
seen.set(nums[i], i)
}
return null
}Dùng Hash Map lưu mỗi giá trị đã thấy kèm chỉ số.
- Mỗi bước chỉ cần tra cứu
target - nums[i]xem đã tồn tại chưa — O(1) average. - Trade-off: tốn O(n) space để giảm time từ O(n²) xuống O(n).
Chạy thử từng bước
- 1
i=0: nums[0]=2. complement = 9−2 = 7.
- Tra
seen→ đang rỗng, chưa có 7. - Lưu {2 → 0} (giá trị → chỉ số).
i:0value:2complement:7seen:{"2":0}found:null - Tra
- 2
i=1: nums[1]=7. complement = 9−7 = 2.
Tra
seen→ CÓ key 2 (đã lưu ở bước trước, tại index 0)!i:1value:7complement:2seen:{"2":0}hit:true - 3
Tìm thấy cặp bù nhau → trả về [0, 1] vì nums[0] + nums[1] = 2 + 7 = 9.
found:[0,1]
Trường hợp biên phải nhớ
Mảng có 2 phần tử bằng nhau cộng đúng target (ví dụ [3, 3], target=6) — vẫn đúng vì ta check seen TRƯỚC khi set, nên index 0 và 1 không trùng nhau.
Số âm: target=-5, nums=[-3, -2] → complement=-5-(-3)=-2, tìm thấy đúng.
Phần tử 0: nums=[0, 4, 3, 0], target=0 → trả về [0, 3], không phải dùng cùng index.
Mảng rỗng hoặc 1 phần tử — đề giả định luôn có lời giải, nhưng code vẫn return null nếu không tìm thấy để tránh crash.