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

Monoton Yığın

Rehber 5 / 6 · Yol 5 / 6

Interactive

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
stack

Next warmer day. Stack keeps decreasing temperatures (by index).

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

Tested only
Time O(n)Space 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.

Solution
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