İçeriğe atla
ΣDSA Patterns
Menü
Dil

Kalıp #15

Geri İzleme

Temel

Seç, 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

  1. Durumu tanımla (path, indeks, kalan hedef, used maskesi).
  2. Temel durum: tam geçerli yolu kaydet.
  3. Seçimleri döngüle; push; özyinele; pop.
  4. 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ürBitti
  1. 1#39 Combination SumRehber
  2. 2#46 PermutationsRehber
  3. 3#78 SubsetsRehber
  4. 4#79 Word SearchRehber
  5. 5#90 Subsets IIRehber
  6. 6#131 Palindrome PartitioningRehber