力扣题目链接
// 版本一
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情况一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情况二st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {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;}
};
代码随想录 (programmercarl.com)
困难题我一般都只是看看,理解思路,跟着敲一遍代码。
真正的理解就是能自己把思路写出来,画图来形容更容易理解。
这一题我比较喜欢双指针的解法。
不过其中的循环查找对于我来说比较难理解。
最后还是跟着单调栈解法敲了一遍代码。