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

Monoton Yığın

Rehber 2 / 6 · Yol 2 / 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 / 7
1
0
1
1
1
1
1
1
1

En büyük 1'ler dikdörtgeni. Her satır, yukarı doğru ardışık 1'lerin histogram tabanı.

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

Maximal Rectangle

Problem (yeniden ifade)

‘0’/‘1’ ikili matrisi. Yalnızca 1 içeren en büyük dikdörtgenin alanını döndür.

Sezgi

Her satırı bir histogram tabanı olarak ele al: heights[c] = yukarı doğru ardışık 1’ler. Satır başına histogramdaki en büyük dikdörtgen (monoton yığın); max’ı al.

Yaklaşımlar

Satır başına histogram + yığın

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

Fikir. ’0’da yüksekliği sıfırla. LC84 ile aynı yığın şablonu.

Yürüyüş. 2×3’lük birler bloğu → alt satır yükseklikleri [2,2,2] görünce alan 6.

Trade-off. DP left/right/up da O(mn); yığın LC84’ü yeniden kullanır.

Çözüm
export function maximalRectangle(matrix: string[][]): number {
  if (!matrix.length || !matrix[0]!.length) return 0;
  const m = matrix.length, n = matrix[0]!.length;
  const heights = Array(n).fill(0);
  let best = 0;
  const largestRectangle = (h: number[]): number => {
    const stack: number[] = [];
    let ans = 0;
    for (let i = 0; i <= h.length; i++) {
      const cur = i === h.length ? 0 : h[i]!;
      while (stack.length && cur < h[stack[stack.length - 1]!]!) {
        const height = h[stack.pop()!]!;
        const left = stack.length ? stack[stack.length - 1]! : -1;
        ans = Math.max(ans, height * (i - left - 1));
      }
      stack.push(i);
    }
    return ans;
  };
  for (let r = 0; r < m; r++) {
    for (let c = 0; c < n; c++) heights[c] = matrix[r]![c] === "1" ? heights[c]! + 1 : 0;
    best = Math.max(best, largestRectangle(heights));
  }
  return best;
}
export function maximalRectangle(matrix: string[][]): number {
  if (!matrix.length || !matrix[0]!.length) return 0;
  const m = matrix.length, n = matrix[0]!.length;
  const heights = Array(n).fill(0);
  let best = 0;
  const largestRectangle = (h: number[]): number => {
    const stack: number[] = [];
    let ans = 0;
    for (let i = 0; i <= h.length; i++) {
      const cur = i === h.length ? 0 : h[i]!;
      while (stack.length && cur < h[stack[stack.length - 1]!]!) {
        const height = h[stack.pop()!]!;
        const left = stack.length ? stack[stack.length - 1]! : -1;
        ans = Math.max(ans, height * (i - left - 1));
      }
      stack.push(i);
    }
    return ans;
  };
  for (let r = 0; r < m; r++) {
    for (let c = 0; c < n; c++) heights[c] = matrix[r]![c] === "1" ? heights[c]! + 1 : 0;
    best = Math.max(best, largestRectangle(heights));
  }
  return best;
}

Şablon bağlantısı

Her satırda monoton yığın histogramı (LC84).

Derinlemesine

Her satırı bir histogram tabanı olarak ele al: matrix[r][c] == '1' ise heights[c] = heights[c] + 1, değilse 0’a sıfırla. Satır r için histogramı güncelledikten sonra histogramdaki en büyük dikdörtgeni (LC 84) çalıştır. Cevap tüm satırlar üzerindeki max. Bu, 2D bir problemi 1D monoton-yığın şablonunun rows çağrısına indirger.

Yansıma