Kalıp #09
Monoton Yığın
ÖnerilenSonraki büyük/küçük, histogram dikdörtgenleri ve sıcaklık bekleme.
Ne zaman kullanılır
Her indeks için solda veya sağda en yakın daha büyük/küçük veya bir bariyere kadar span gerektiğinde.
Tanıma ipuçları
- Sonraki daha büyük / daha küçük eleman
- Günlük sıcaklıklar / online hisse span
- Histogramda en büyük dikdörtgen
Yaygın tuzaklar
- Sıkı vs sıkı olmayan karşılaştırma (yinelenenleri etkiler)
- Mesafe gerektiğinde değer yerine indeks saklamamak
- Histogram için sol ve sağ bariyerleri unutmak
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- Sonraki daha büyük / daha küçük eleman
- Günlük sıcaklıklar / online hisse span
- Histogramda en büyük dikdörtgen
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 / 9
73
74
75
71
69
72
76
73
stack
∅
Next warmer day. Stack keeps decreasing temperatures (by index).
Nasıl düşünülür
Değerleri monoton (artan veya azalan) indekslerin yığınını tut. Yeni değer sırayı bozunca pop et ve o indeksleri çöz: yeni gelen onların sonraki büyük/küçüğü. Her indeks en fazla bir push/pop görür.
Şablon şekilleri
| Şekil | Temel hamle | Notlar |
|---|---|---|
| Sağda sonraki büyük | top < current iken pop | Answer[top]=current |
| Sonraki küçük | Karşılaştırmayı çevir | Aynı yapı |
| Histogram | Önceki + sonraki küçük | Genişlik = R-L-1 |
Karmaşıklık temeli
O(n) zaman (amortize her indeks bir push/pop), O(n) yığın alanı.
Şablondan probleme
- Yön (sol→sağ veya sağ→sol) ve monoton sırayı seç.
- Dolaş; yığın tepesi current ile çözülebilirse pop et ve cevabı yaz.
- Current indeksi push et.
- Kalan yığını sentinel cevaplarla (-1 veya n) boşalt.
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
Monoton Yığın · Şablon
/** Monotonic stack template: next greater element to the right (−1 if none). */
export function nextGreater(nums: number[]): number[] {
const n = nums.length;
const ans = new Array<number>(n).fill(-1);
const stack: number[] = [];
for (let i = 0; i < n; i++) {
while (stack.length && nums[stack.at(-1)!]! < nums[i]!) {
ans[stack.pop()!] = nums[i]!;
}
stack.push(i);
}
return ans;
}
/** Monotonic stack template: next greater element to the right (−1 if none). */
export function nextGreater(nums: number[]): number[] {
const n = nums.length;
const ans = new Array<number>(n).fill(-1);
const stack: number[] = [];
for (let i = 0; i < n; i++) {
while (stack.length && nums[stack.at(-1)!]! < nums[i]!) {
ans[stack.pop()!] = nums[i]!;
}
stack.push(i);
}
return ans;
}
#DurumProblemTürZorlukBitti
- 1#84 Largest Rectangle in HistogramRehberhard
- 2#85 Maximal RectangleRehberhard
- 3#496 Next Greater Element IRehbereasy
- 4#503 Next Greater Element IIRehbermedium
- 5#739 Daily TemperaturesRehbermedium
- 6#907 Sum of Subarray MinimumsRehbermedium