https://leetcode.cn/problems/largest-rectangle-in-histogram/submissions/
スタックの最上部とスタック最上部の次の要素、およびスタックにプッシュされる 3 つの要素が、必要な最大領域の高さと幅を構成します。
各列の左側と右側で、その列より小さい最初の列を見つけます。そのため、スタック ヘッド (要素はスタック ヘッドからポップされる) からスタックの一番下までの順序は、大きいものから小さいものになるはずです。
次の 3 つの状況です。
ケース 1: 現在トラバースされている要素の heights[i] が、スタックの最上位要素の heights[st.peek()] より小さい
ケース 2: 現在トラバースされている要素の heights[i] が、スタックの最上位要素の heights[st.peek()] に等しい
ケース 3: 現在トラバースされている要素の heights[i] がスタックの最上位要素の heights[st.peek()] より大きい
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> st = new Stack<Integer>();
int[] newheights = new int[heights.length + 2];
newheights[0] = 0;
newheights[newheights.length -1] =0;
int sum =0;
for(int i=0;i<heights.length;i++){
newheights[i+1] = heights[i];
}
st.push(0);
heights = newheights;
for(int i=1;i<heights.length;i++){
if(heights[i] > heights[st.peek()]){
st.push(i);
}else if(heights[i] == heights[st.peek()]){
st.pop();
st.push(i);
}else{
while(heights[i] < heights[st.peek()]){
int mid = st.peek();
st.pop();
int left = st.peek();
int right =i;
int w= right -left -1;
int h = heights[mid];
sum = Math.max(sum,w*h);
}
st.push(i);
}
}
return sum;
}
}