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

Geri İzleme

Rehber 1 / 6 · Yol 1 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
2
3
6
7
yığın
∅

path = [] · remain = 7

Combination sum: adaylar [2,3,6,7], hedef 7. Yeniden kullanım serbest; başlangıç indeksi kombinasyonları benzersiz tutar.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Combination Sum

Problem (yeniden ifade)

Ayrı adaylar; sınırsız yeniden kullanım. Toplamı target olan tüm benzersiz kombinasyonları bul.

Sezgi

Başlangıç indeksli DFS (sıra sabit → benzersizlik). Alındıktan sonra dfs(i) çağır, i+1 değil — yeniden kullanım böyle olur.

Yaklaşımlar

Yeniden kullanıma izin veren DFS

Doğrulanmadı
Zaman O(n^(T/min))Alan O(T/min)

Fikir. dfs(start, remain): 0 ise kaydet; i>=start için candidates[i] remain’den büyük değilse al ve dfs(i).

Yürüyüş. candidates=[2,3,6,7], target=7 → [2,2,3] ve [7].

Trade-off. Permütasyonların aksine, start indeksi sıra yinelenmelerini önler.

Çözüm
export function combinationSum(candidates: number[], target: number): number[][] {
  const res: number[][] = [];
  const path: number[] = [];
  const dfs = (start: number, remain: number) => {
    if (remain === 0) { res.push([...path]); return; }
    for (let i = start; i < candidates.length; i++) {
      const x = candidates[i]!;
      if (x > remain) continue;
      path.push(x);
      dfs(i, remain - x);
      path.pop();
    }
  };
  dfs(0, target);
  return res;
}
export function combinationSum(candidates: number[], target: number): number[][] {
  const res: number[][] = [];
  const path: number[] = [];
  const dfs = (start: number, remain: number) => {
    if (remain === 0) { res.push([...path]); return; }
    for (let i = start; i < candidates.length; i++) {
      const x = candidates[i]!;
      if (x > remain) continue;
      path.push(x);
      dfs(i, remain - x);
      path.pop();
    }
  };
  dfs(0, target);
  return res;
}

Şablon bağlantısı

Yeniden kullanımlı backtracking.

Yansıma