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

Geri İzleme

Rehber 5 / 6 · Yol 5 / 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
1
2
2

sort, then DFS

Subsets II: [1,2,2] yinelenen içerir. Önce sırala ki eşitler yan yana dursun.

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

Subsets II

Problem (yeniden ifade)

Yinelenen içerebilen bir tamsayı dizisinin tüm benzersiz alt kümelerini döndür.

Sezgi

Subsets ile aynı güç kümesi DFS’i, ama önce sırala ve aynı derinlikte eşit kardeşleri atla.

Yaklaşımlar

Sırala + yinelenenleri atla

Doğrulanmadı
Zaman O(n * 2^n)Alan O(n)

Fikir. Sırala; start i’de, nums[i]==nums[i-1] ve i>start ise continue (aynı seçim zaten keşfedildi).

Yürüyüş. [1,2,2] → [], [1], [1,2], [1,2,2], [2], [2,2] - yinelenen [1,2] yok.

Trade-off. Yalnızca aynı seviyede atlamak, ardışık alımlarla çok kopyalı alt kümeleri korur.

Çözüm
export function subsetsWithDup(nums: number[]): number[][] {
  nums = [...nums].sort((a, b) => a - b);
  const res: number[][] = [];
  const path: number[] = [];
  const dfs = (start: number) => {
    res.push([...path]);
    for (let i = start; i < nums.length; i++) {
      if (i > start && nums[i] === nums[i - 1]) continue;
      path.push(nums[i]!);
      dfs(i + 1);
      path.pop();
    }
  };
  dfs(0);
  return res;
}
export function subsetsWithDup(nums: number[]): number[][] {
  nums = [...nums].sort((a, b) => a - b);
  const res: number[][] = [];
  const path: number[] = [];
  const dfs = (start: number) => {
    res.push([...path]);
    for (let i = start; i < nums.length; i++) {
      if (i > start && nums[i] === nums[i - 1]) continue;
      path.push(nums[i]!);
      dfs(i + 1);
      path.pop();
    }
  };
  dfs(0);
  return res;
}

Şablon bağlantısı

Yinelenen budamalı backtracking (Combination Sum II gibi).

Yansıma