Kalıp #21
Greedy
ÖnerilenYerel 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.
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
- Yerel kuralı bir cümlede söyle.
- Gerekirse sırala veya çalışan en iyiyi tut.
- Bir kez tara, kuralı uygula; başarısızlık koşullarını izle.
- 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 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;
}
- 1#45 Jump Game IIRehbermedium
- 2#55 Jump GameRehbermedium
- 3#134 Gas StationRehbermedium
- 4#435 Non-overlapping IntervalsRehbermedium
- 5#621 Task SchedulerRehbermedium
- 6#763 Partition LabelsRehbermedium