対象アルゴリズム:単調増加スタック法 (Monotonic Increasing Stack) / 言語:Python (CPython 3.11+)
配列を一次走査し、高さが単調に増加するインデックスをスタックへ保持します。現在の高さがスタック頂点より低くなった時、頂点を最小高さとする長方形の幅が確定します。末尾では番兵(高さ0)を用い、残りを一括処理することで1本のループで実装できます。
from typing import List
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n: int = len(heights)
stack: List[int] = []
h = heights
ma = 0
st = stack
for i in range(n + 1):
curr: int = 0 if i == n else h[i] # sentinel at i==n
while st and curr < h[st[-1]]:
top: int = st.pop()
height: int = h[top]
left: int = st[-1] if st else -1
width: int = i - left - 1
area: int = height * width
if area > ma:
ma = area
st.append(i) # push current index (sentinel allowed)
return ma
※ 余白を圧縮し、行番号ガターを狭めて空白を最小化しています。
例:[2, 1, 5, 6, 2, 3]
を順に処理。各ステップでスタックと更新面積を表示します(クリックでジャンプ)。