Largest Rectangle in Histogram (Lintcode 122, Leetcode 84)

这道题运用了单调栈的思想。单调栈的用法是:用来找数组,左边或右边,第一个比当前元素小(或者大)的是谁。即insert前,栈顶的元素。

这道题的trick是,栈中存的不是元素,而是数组index,这样才方便计算面积.

解法一:从左往右+从右往左扫两遍,分别找比当前元素小的。然后用map统计结果

int largestRectangleArea(vector<int> &height) {
    // write your code here
    if(height.empty()) return 0;
    stack<int> st;
    unordered_map<int, int> mp;
    for(int i=0; i<height.size(); i++){
        while(!st.empty() && height[st.top()] >= height[i]){
            st.pop();
        }
        if(!st.empty()) mp[i] += height[i] * (i - st.top());
        else mp[i] += height[i] * (i+1);
        st.push(i);
    }
    stack<int> st2;
    for(int i=height.size()-1; i>=0; i--){
        while(!st2.empty() && height[st2.top()] >= height[i]){
            st2.pop();
        }
        if(!st2.empty()) mp[i] += height[i] * (st2.top() - 1 - i);
        else mp[i] += height[i] * (height.size() - 1 - i);
        st2.push(i);
    }
    int max_ret = 0;
    for(auto it : mp){
        max_ret = max(max_ret, it.second);
    }
    return max_ret;
    
}

解法二:九章的解法,想法更加巧妙。push的时候不计算面积,而pop的时候才计算面积。最后要push一个-1进去,来把最小元素pop出来。这样扫一遍就可以搞定。注意,计算面积,是pop当前index之后,由剩下的边作为终止边,然后要横轴需要减一。

class Solution {
public:
    /**
     * @param height: A list of integer
     * @return: The area of largest rectangle in the histogram
     */
    int largestRectangleArea(vector<int> &height) {
        // write your code here
        if(height.empty()) return 0;
        height.insert(height.begin(), -1);
        height.push_back(-1);
        stack<int> st;
        int max_ret = 0;
        for(int i=0; i<height.size(); i++){
            while(!st.empty() && height[st.top()] > height[i]){
                int h = height[st.top()]; st.pop();
                max_ret = max(max_ret, (i - st.top() - 1) * h);
            }
            st.push(i);
        }
        return max_ret;
    }
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、栈 1.1 栈的实现 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。java没有栈这样的数据结...
    yjaal阅读 1,553评论 0 1
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 13,033评论 0 33
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,578评论 0 19
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,066评论 0 89
  • 年少时为人轻狂,时常口无遮拦且脾气暴躁,还自以为是,直到碰了若干次壁后,终于开始自省。第一次大的改变是关于购...
    呼啦啦小虫子阅读 429评论 0 0

友情链接更多精彩内容