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

Greedy

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
A
A
A
B
B
B

n = 2

Task scheduler: AAA BBB, cooldown n=2. Aynı harf koşular arasında 2 idle (veya başka) yuva ister.

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

Mediumgreedy

Task Scheduler

Problem (yeniden ifade)

A-Z etiketli CPU görevleri. Aynı harfin çalıştırmaları arasında n cooldown gerekir. Sıra serbest; idle serbest. Minimum toplam zaman birimi.

Sezgi

En sık görev (maxf-1) adet n uzunluğunda boşluk zorlar. Boşlukları diğer görevlerle doldur; kalan idle’lar çizelgeyi şişirir.

Yaklaşımlar

Maks frekanstan idle slotlar

Doğrulanmadı
Zaman O(n)Alan O(1)

Fikir. idles = max(0, empty, available); cevap = tasks + idles. Birden fazla max-freq görev boşluk genişliğini daraltır.

Yürüyüş. tasks=AAABBB, n=2 → 8.

Trade-off. Priority queue simülasyonu O(n log 26); formül O(n).

Çözüm
export function leastInterval(tasks: string[], n: number): number {
  const freq = Array(26).fill(0);
  let maxf = 0, maxCount = 0;
  for (const t of tasks) {
    const i = t.charCodeAt(0) - 65;
    freq[i]!++;
    if (freq[i]! > maxf) {
      maxf = freq[i]!;
      maxCount = 1;
    } else if (freq[i] === maxf) maxCount++;
  }
  const parts = maxf - 1;
  const partLen = n - (maxCount - 1);
  const empty = Math.max(0, parts * partLen);
  const available = tasks.length - maxf * maxCount;
  const idles = Math.max(0, empty - available);
  return tasks.length + idles;
}
export function leastInterval(tasks: string[], n: number): number {
  const freq = Array(26).fill(0);
  let maxf = 0, maxCount = 0;
  for (const t of tasks) {
    const i = t.charCodeAt(0) - 65;
    freq[i]!++;
    if (freq[i]! > maxf) {
      maxf = freq[i]!;
      maxCount = 1;
    } else if (freq[i] === maxf) maxCount++;
  }
  const parts = maxf - 1;
  const partLen = n - (maxCount - 1);
  const empty = Math.max(0, parts * partLen);
  const available = tasks.length - maxf * maxCount;
  const idles = Math.max(0, empty - available);
  return tasks.length + idles;
}

Şablon bağlantısı

Greedy paketleme / frekans darboğazı.

Yansıma