Kalıp #15
Geri İzleme
TemelSeç, keşfet, geri al. Tüm geçerli kombinasyonları kur veya budamayla ara.
Ne zaman kullanılır
Tüm çözümleri üretmelisin (alt kümeler, permütasyonlar, kombinasyonlar) veya kısıtlı karar ağacında arama.
Tanıma ipuçları
- Alt kümeler / permütasyonlar / kombinasyonlar
- Kelime arama / N-Queens tarzı kısıtlar
- Geri almalı yol kurma
Yaygın tuzaklar
- Geri almayı unutmak (path mutasyonu, pop yok)
- Yinelenen veya kaçan sonuçlara yol açan yanlış başlangıç indeksi
- Kısmi yol zaten geçersizken budamamak
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- Alt kümeler / permütasyonlar / kombinasyonlar
- Kelime arama / N-Queens tarzı kısıtlar
- Geri almalı yol kurma
Interactive
Zihinsel model
Değişmezin tam adım adım anlatımı. Duraklat, noktalara tıkla veya ← → kullan. Her adımı kendi cümlelerinle anlatmayı hedefle.
Adım 1 / 8
1
2
3
path = []
Permutations of [1,2,3]: choose, explore, undo.
Nasıl düşünülür
Her adımda bir seçim dene, özyinele, sonra geri al. Çağrı yığını güncel yoldur. Kısmi çözüm geçerli tamamlanmaya götüremezse buda. Yinelenen çıktıyı önlemek için seçim sırasına dikkat et.
Şablon şekilleri
| Şekil | Temel hamle | Notlar |
|---|---|---|
| Alt kümeler | Her elemanı al veya atla | Her düğümde path kopyası |
| Permütasyonlar | Swap veya used[] maskesi | Uzunluk == n → kaydet |
| Kombinasyonlar | Başlangıç indeksi i | Yeniden sıralı yinelenenlerden kaçın |
Karmaşıklık temeli
Çıktıya duyarlı: genelde O(n·#çözüm). Ekstra alan özyineleme derinliği O(n).
Şablondan probleme
- Durumu tanımla (path, indeks, kalan hedef, used maskesi).
- Temel durum: tam geçerli yolu kaydet.
- Seçimleri döngüle; push; özyinele; pop.
- Budama ekle (toplam fazla, hücre ziyaret, vb.).
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
Geri İzleme · Şablon
/** Backtracking template: subsets (choose / skip via start index). */
export function subsets(nums: number[]): number[][] {
const res: number[][] = [];
const path: number[] = [];
const dfs = (start: number) => {
res.push([...path]);
for (let i = start; i < nums.length; i++) {
path.push(nums[i]!);
dfs(i + 1);
path.pop();
}
};
dfs(0);
return res;
}
/** Backtracking template: subsets (choose / skip via start index). */
export function subsets(nums: number[]): number[][] {
const res: number[][] = [];
const path: number[] = [];
const dfs = (start: number) => {
res.push([...path]);
for (let i = start; i < nums.length; i++) {
path.push(nums[i]!);
dfs(i + 1);
path.pop();
}
};
dfs(0);
return res;
}
#DurumProblemTürZorlukBitti
- 1#39 Combination SumRehbermedium
- 2#46 PermutationsRehbermedium
- 3#78 SubsetsRehbermedium
- 4#79 Word SearchRehbermedium
- 5#90 Subsets IIRehbermedium
- 6#131 Palindrome PartitioningRehbermedium