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

Kalıp #09

Monoton Yığın

Önerilen

Sonraki 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

  1. Yön (sol→sağ veya sağ→sol) ve monoton sırayı seç.
  2. Dolaş; yığın tepesi current ile çözülebilirse pop et ve cevabı yaz.
  3. Current indeksi push et.
  4. 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ürBitti
  1. 1#84 Largest Rectangle in HistogramRehber
  2. 2#85 Maximal RectangleRehber
  3. 3#496 Next Greater Element IRehber
  4. 4#503 Next Greater Element IIRehber
  5. 5#739 Daily TemperaturesRehber
  6. 6#907 Sum of Subarray MinimumsRehber