mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-02-02 18:39:09 +08:00
版本更新
This commit is contained in:
@@ -1,104 +0,0 @@
|
||||
|
||||
# 链接
|
||||
|
||||
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
|
||||
|
||||
## 思路
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int largestRectangleArea(vector<int>& heights) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i < heights.size(); i++) {
|
||||
int left = i;
|
||||
int right = i;
|
||||
for (; left >= 0; left--) {
|
||||
if (heights[left] < heights[i]) break;
|
||||
}
|
||||
for (; right < heights.size(); right++) {
|
||||
if (heights[right] < heights[i]) break;
|
||||
}
|
||||
int w = right - left - 1;
|
||||
int h = heights[i];
|
||||
sum = max(sum, w * h);
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
如上代码并不能通过leetcode,超时了,因为时间复杂度是O(n^2)。
|
||||
|
||||
## 思考一下动态规划
|
||||
|
||||
## 单调栈
|
||||
|
||||
单调栈的思路还是不容易理解的,
|
||||
|
||||
想清楚从大到小,还是从小到大,
|
||||
|
||||
本题是从栈底到栈头 从小到大,和 接雨水正好反过来。
|
||||
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int largestRectangleArea(vector<int>& heights) {
|
||||
stack<int> st;
|
||||
heights.insert(heights.begin(), 0); // 数组头部加入元素0
|
||||
heights.push_back(0); // 数组尾部加入元素0
|
||||
st.push(0);
|
||||
int result = 0;
|
||||
// 第一个元素已经入栈,从下表1开始
|
||||
for (int i = 1; i < heights.size(); i++) {
|
||||
// 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表
|
||||
if (heights[i] > heights[st.top()]) {
|
||||
st.push(i);
|
||||
} else if (heights[i] == heights[st.top()]) {
|
||||
st.pop(); // 这个可以加,可以不加,效果一样,思路不同
|
||||
st.push(i);
|
||||
} else {
|
||||
while (heights[i] < heights[st.top()]) { // 注意是while
|
||||
int mid = st.top();
|
||||
st.pop();
|
||||
int left = st.top();
|
||||
int right = i;
|
||||
int w = right - left - 1;
|
||||
int h = heights[mid];
|
||||
result = max(result, w * h);
|
||||
}
|
||||
st.push(i);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
代码精简之后:
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int largestRectangleArea(vector<int>& heights) {
|
||||
stack<int> st;
|
||||
heights.insert(heights.begin(), 0); // 数组头部加入元素0
|
||||
heights.push_back(0); // 数组尾部加入元素0
|
||||
st.push(0);
|
||||
int result = 0;
|
||||
for (int i = 1; i < heights.size(); i++) {
|
||||
while (heights[i] < heights[st.top()]) {
|
||||
int mid = st.top();
|
||||
st.pop();
|
||||
int w = i - st.top() - 1;
|
||||
int h = heights[mid];
|
||||
result = max(result, w * h);
|
||||
}
|
||||
st.push(i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
Reference in New Issue
Block a user