Pelajaran 4.4
Two sum dengan map
7 menit · 8 langkah
Langkah 1 dari 8 · Penjelasan
Soal: "Return index dua angka yang jumlahnya
target." Brute force mengecek semua pasangan, O(n²).Dengan map, balik pertanyaannya. Untuk setiap angka
x, pasangannya pastitarget - x. Tanya map: "sudah pernah lihattarget - x?" Kalau belum, simpanxbeserta index-nya, lalu lanjut. Satu kali jalan, O(n).Langkah 2 dari 8 · Tebak hasilnya
Apa yang di-return untuk
[3, 2, 4]dan target6?function solution(nums, target) { const seen = new Map() for (let i = 0; i < nums.length; i++) { const need = target - nums[i] if (seen.has(need)) { return [seen.get(need), i] } seen.set(nums[i], i) }}[1, 2][0, 0][2, 1]
Langkah 3 dari 8 · Tebak hasilnya
Apa yang di-return untuk
[3, 3]dan target6?function solution(nums, target) { const seen = new Map() for (let i = 0; i < nums.length; i++) { const need = target - nums[i] if (seen.has(need)) { return [seen.get(need), i] } seen.set(nums[i], i) }}[0, 1][1, 1][0, 0]
Langkah 4 dari 8 · Cari bug-nya
Kode ini mencari index dua angka yang jumlahnya
target. Untuk[3, 2, 4]dan target6, ia me-return[0, 0], padahal harusnya[1, 2]. Ketuk baris yang ada di tempat yang salah.function solution(nums, target) { const seen = new Map() for (let i = 0; i < nums.length; i++) { seen.set(nums[i], i) const need = target - nums[i] if (seen.has(need)) return [seen.get(need), i] }}Langkah 5 dari 8 · Telusuri kodenya
Isi
idanneeddi langkah yang ditandai, untuk[1, 5, 3, 7]dan target10.function solution(nums, target) { const seen = new Map() for (let i = 0; i < nums.length; i++) { const need = target - nums[i] if (seen.has(need)) { return [seen.get(need), i] } seen.set(nums[i], i) }}solution([1, 5, 3, 7], 10)
Langkah 6 dari 8 · Pilih pendekatan
"Return index dua angka di
numsyang jumlahnyatarget." Constraint:2 ≤ nums.length ≤ 10⁵, tepat satu jawaban, return index aslinya.
Cara mana yang tepat?- Map dari angka ke index, satu kali jalan
- Semua pasangan dengan dua loop
- Set berisi semua angka
- Sort, lalu cari dari kedua ujung
Langkah 7 dari 8 · Susun kodenya
Versi lebih sulit: return berapa pasangan
(i, j)dengani < jyang jumlahnyatarget. Map menyimpan hitungan, bukan index. Satu baris tidak termasuk.counts.set(x, (counts.get(x) || 0) + 1)}}return pairsfor (const x of nums) {pairs += counts.get(target - x) || 0function solution(nums, target) {let pairs = 0pairs += counts.has(target - x) ? 1 : 0const counts = new Map()Langkah 8 dari 8 · Ringkasan
- Balik pertanyaannya: untuk setiap
x, caritarget - xyang sudah lewat. - Cek dulu, baru simpan. Itu mencegah angka berpasangan dengan dirinya sendiri.
- Simpan apa yang dibutuhkan jawaban. Index untuk "di mana", hitungan untuk "berapa banyak".
- Balik pertanyaannya: untuk setiap