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

Kalıp #21

Greedy

Önerilen

Yerel en iyi seçimi, küresel optimumu bozmayacağını kanıtlayabildiğinde yap.

Ne zaman kullanılır

Sıralama veya net öncelikten sonra tek ileri geçiş geri dönülmez karar verir ve optimal kalır (exchange argümanı).

Tanıma ipuçları

  • Jump game / jump game II
  • Benzin istasyonu / görev zamanlayıcı
  • Sırala sonra tara / en erken bitiş önce

Yaygın tuzaklar

  • İspatsız greedy (karşı örnekler vardır)
  • Yanlış sıralama anahtarı
  • Gelecek seçimler etkileşirken greedy'yi DP ile karıştırmak

90 saniyelik tanıma egzersizi

Hangisi en iyi uyuyor?

  • Jump game / jump game II
  • Benzin istasyonu / görev zamanlayıcı
  • Sırala sonra tara / en erken bitiş önce

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
2
3
1
1
4

far = 0

Jump Game: track the farthest index reachable so far.

Nasıl düşünülür

Her seçim için bir skor tanımla (en uzak erişim, en erken bitiş, en büyük kazanç). Sırala veya tara ki sonraki seçim açık olsun. Başka bir seçimi seninkisiyle değiştirmenin cevabı iyileştiremeyeceğini kanıtla (exchange).

Şablon şekilleri

Şekil Temel hamle Notlar
Jump erişim En uzağı izle i > far ise fail
Aralık seç En erken bitiş önce Maks örtüşmesiz
Benzin devresi tank + start izle total ≥ 0 ise benzersiz devre

Karmaşıklık temeli

Sıralama + tarama genelde O(n log n) + O(n), veya salt O(n).

Şablondan probleme

  1. Yerel kuralı bir cümlede söyle.
  2. Gerekirse sırala veya çalışan en iyiyi tut.
  3. Bir kez tara, kuralı uygula; başarısızlık koşullarını izle.
  4. Küçük bir karşı örnek denemesiyle sağduyu kontrolü.

Şablon

TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.

Greedy · Şablon
/** Greedy template: Jump Game (farthest reach). Track far; fail if i > far. */
export function canJump(nums: number[]): boolean {
  let far = 0;
  for (let i = 0; i < nums.length; i++) {
    if (i > far) return false;
    far = Math.max(far, i + nums[i]!);
    if (far >= nums.length - 1) return true;
  }
  return true;
}
/** Greedy template: Jump Game (farthest reach). Track far; fail if i > far. */
export function canJump(nums: number[]): boolean {
  let far = 0;
  for (let i = 0; i < nums.length; i++) {
    if (i > far) return false;
    far = Math.max(far, i + nums[i]!);
    if (far >= nums.length - 1) return true;
  }
  return true;
}
#DurumProblemTürBitti
  1. 1#45 Jump Game IIRehber
  2. 2#55 Jump GameRehber
  3. 3#134 Gas StationRehber
  4. 4#435 Non-overlapping IntervalsRehber
  5. 5#621 Task SchedulerRehber
  6. 6#763 Partition LabelsRehber