単調なスタック
単調スタックは、その名前が示すように、スタック内の要素が増加 (減少) 順に単調に配置されたスタックです。
単調増加スタック:
① キュー内の各要素の右側からそれより小さい最初の要素を検索します。
② キュー内の各要素の左側からそれより小さい最初の要素を検索します。
単調減少スタック:
① キュー内の各要素の右側からそれより大きい最初の要素を検索します。
② キュー内の各要素の左側からそれより大きい最初の要素を検索します。
モノトーン スタックを使用する場合: 任意の要素について、それ自体よりも大きい/小さい最初の位置を左右で見つけて、モノトーン スタックを使用します。
各要素はスタックに出入りするのは最大 1 回であるため、複雑さは O(n) です。
ネギ84
n 個の負でない整数が指定され、ヒストグラムの各列の高さを表すために使用されます。各列は互いに隣接しており、幅は 1 です。
ヒストグラムで輪郭を描くことができる長方形の最大面積を見つけます。
例1:
入力: heights = [2,1,5,6,2,3]
出力: 10
説明: 最大の長方形は図の赤い部分で、面積は10です。
例 2:
入力: 高さ = [2,4]
出力: 4
ヒント:
1 <= heights.length <=105
0 <= heights[i] <= 104
一連の考え
単調増加スタックは、スタックにプッシュされるときは、最初の列の座標を左側よりも小さく維持し、スタックからポップアウトするときは、最初の列の座標を右側よりも小さく維持します。
コード
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> left(n), right(n, n);
stack<int> mono_stack;
for (int i = 0; i < n; ++i) {
while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {
right[mono_stack.top()] = i;
mono_stack.pop();
}
left[i] = (mono_stack.empty() ? -1 : mono_stack.top());
mono_stack.push(i);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans, (right[i] - left[i] - 1) * heights[i]);
}
return ans;
}
};