mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Update 0084.柱状图中最大的矩形.md
增加java 单调栈实现
This commit is contained in:
@ -228,6 +228,50 @@ class Solution {
|
||||
}
|
||||
```
|
||||
|
||||
单调栈
|
||||
```java
|
||||
class Solution {
|
||||
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;
|
||||
for (int index = 0; index < heights.length; index++){
|
||||
newHeights[index + 1] = heights[index];
|
||||
}
|
||||
|
||||
heights = newHeights;
|
||||
|
||||
st.push(0);
|
||||
int result = 0;
|
||||
// 第一个元素已经入栈,从下表1开始
|
||||
for (int i = 1; i < heights.length; i++) {
|
||||
// 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表
|
||||
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()]) { // 注意是while
|
||||
int mid = st.peek();
|
||||
st.pop();
|
||||
int left = st.peek();
|
||||
int right = i;
|
||||
int w = right - left - 1;
|
||||
int h = heights[mid];
|
||||
result = Math.max(result, w * h);
|
||||
}
|
||||
st.push(i);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
动态规划
|
||||
|
Reference in New Issue
Block a user