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

Monoton Yığın

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 / 9
73
74
75
71
69
72
76
73
yığın
∅

Sonraki daha sıcak gün. Yığın azalan sıcaklıkları (indeksle) tutar.

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

Daily Temperatures

Problem (yeniden ifade)

Günlük sıcaklıklar verilir; answer[i], i. günden sonra daha sıcak bir güne kaç gün bekleneceğini tutar. Yoksa answer[i]=0.

Sezgi

Sonraki daha büyük eleman → indekslerin monoton azalan yığını. Daha sıcak gün gelince pop edip mesafeyi yaz.

Yaklaşımlar

Monoton azalan yığın

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

Fikir. Yığında sıcaklıkları azalan indeksler. Her gün için tepe daha serinse pop edip answer yaz.

Adım adım. [73,74,75,71,69,72,76,73] → [1,1,4,2,1,1,0,0].

Trade-off’lar. Doğrusal vs O(n²) iç içe tarama. Yığında değer değil indeks tutulur.

Çözüm
export function dailyTemperatures(temperatures: number[]): number[] {
  const n = temperatures.length;
  const ans = new Array<number>(n).fill(0);
  const stack: number[] = [];
  for (let i = 0; i < n; i++) {
    while (stack.length && temperatures[i]! > temperatures[stack[stack.length - 1]!]!) {
      const j = stack.pop()!;
      ans[j] = i - j;
    }
    stack.push(i);
  }
  return ans;
}
export function dailyTemperatures(temperatures: number[]): number[] {
  const n = temperatures.length;
  const ans = new Array<number>(n).fill(0);
  const stack: number[] = [];
  for (let i = 0; i < n; i++) {
    while (stack.length && temperatures[i]! > temperatures[stack[stack.length - 1]!]!) {
      const j = stack.pop()!;
      ans[j] = i - j;
    }
    stack.push(i);
  }
  return ans;
}

Şablon bağlantısı

Monoton yığın sonraki-daha-büyük şablonu.

Yansıma