Two Pointer menggunakan dua pointer yang bergerak menuju satu sama lain (atau searah) untuk mengurangi kompleksitas dari O(n²) jadi O(n).
Pola 1: Converging pointers (dari dua ujung)
// Two Sum di sorted array — O(n)
function twoSum(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left < right) {
const sum = arr[left] + arr[right];
if (sum === target) return [left, right];
if (sum < target) left++;
else right--;
}
return null;
}
twoSum([1, 3, 5, 7, 11], 12); // [1, 4] → 3 + 11 = 14...
Pola 2: Fast & slow pointer
// Cek palindrome — O(n)
function isPalindrome(str) {
let left = 0;
let right = str.length - 1;
while (left < right) {
if (str[left] !== str[right]) return false;
left++;
right--;
}
return true;
}
isPalindrome("racecar"); // true
isPalindrome("hello"); // false
Pola 3: Remove duplicates in-place
function removeDuplicates(arr) {
if (arr.length === 0) return 0;
let slow = 0;
for (let fast = 1; fast < arr.length; fast++) {
if (arr[fast] !== arr[slow]) {
slow++;
arr[slow] = arr[fast];
}
}
return slow + 1; // Jumlah elemen unik
}
const a = [1, 1, 2, 2, 3, 4, 4];
removeDuplicates(a); // 4 → [1, 2, 3, 4, ...]
Kapan pakai Two Pointer?
- Data sudah terurut
- Cari pasangan/triplet yang memenuhi kondisi
- Operasi in-place pada array
- Menggantikan nested loop O(n²)
🎭 Analogi sehari-hari: Two Pointer = dua tangan kamu di buku resep. Tangan kiri di awal, kanan di akhir. Cari resep dengan total halaman tertentu? Kamu mendekati tengah dari dua sisi. Ketemu? Done. Belum? Geser yang lebih kecil ke kanan, atau yang lebih besar ke kiri. 2 langkah lebih efisien dari 1 sambil keliling.
💡 Mengapa Two Pointer jadi O(n) bukan O(n²)? Setiap iterasi, salah satu pointer pasti maju. Tidak ada nested loop yang me-reset. Total langkah max = n (kiri) + n (kanan) = O(n). Insight: gerakan satu arah dengan kondisi monoton.
⚠️ Jebakan umum:
- Lupa data harus terurut untuk converging two-pointer (Two Sum, dll)
- Salah arah pergerakan — pointer maju saat seharusnya mundur = miss target
while left < rightvs<=beda hasil di edge case "1 elemen tersisa"- Modifikasi in-place sambil iterate = lupa pointer kondisi → bug halus
🎯 Pola "ini pakai Two Pointer":
- "Cari pasangan/triplet di sorted array" → Two Sum, 3Sum
- "Cek palindrome" → kiri vs kanan
- "Remove duplicates in-place" → fast/slow
- "Reverse array" → swap kiri-kanan, geser ke tengah
- "Container with most water" → maximize area dari 2 boundary
- General trick: lihat apakah brute force O(n²) bisa jadi O(n) dengan 2 cursor
🧪 Tebakan cepat: Two Sum sorted [1,3,5,7,11], target 12. Left=0, Right=4. 1+11=12 → ketemu! 1 step. Brute force? Up to 10 pairs check. Two pointer menang.
TL;DR: Two Pointer = 2 cursor bergerak satu arah, mengubah O(n²) jadi O(n). Wajib data sorted (atau monotonic). Klasik untuk: pair search, palindrome, in-place dedup, reverse.