栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 84. 柱状图中最大的矩形、85. 最大矩形(单调栈2)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 84. 柱状图中最大的矩形、85. 最大矩形(单调栈2)

总结
  1. 单调栈作用:在一维数组中找第一个满足某种条件的数
  2. 将题目转换为,找到heights[i]左右第一个比heights[i]小的下标[left,right]
  3. 下一个更小元素==>递增栈
84. 柱状图中最大的矩形 题目

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

解一

两次循环,利用单调栈填表vector left,right

class Solution {
public:
    int largestRectangleArea(vector& heights) {
        int ans=0;
        stack st;
        int n=heights.size();
        vector left(n,-1),right(n,n);
        //找右边界
        for(int i=0;i
            while(!st.empty()&&heights[i]
                int tmp=st.top();
                st.pop();
                right[tmp]=i;
            }
            st.push(i);
        }
        st=stack();
        //找左边界
        for(int i=n-1;i>=0;i--){
            while(!st.empty()&&heights[i]
                int tmp=st.top();
                st.pop();
                left[tmp]=i;
            }
            st.push(i);
        }
        for(int i=0;i
            ans=max(ans,(right[i]-left[i]-1)*heights[i]);
        }
        return ans;
    }
};
解二

对解一进行优化,一次循环。出栈找right(i),入栈找left(stk.top())

class Solution {
public:
    int largestRectangleArea(vector& heights) {
        int ans=0;
        stack st;
        int n=heights.size();
        vector left(n,-1),right(n,n);
        for(int i=0;i
            while(!st.empty()&&heights[i]
                //出栈时找到right(right=i),right是可信的
                int tmp=st.top();
                st.pop();
                right[tmp]=i;
            }
            //入栈时找到left,此时栈顶元素>=height[i],相同元素最左边的left是可信的
            if(!st.empty()){
                left[i]=st.top();
            }
            st.push(i);
        }
        for(int i=0;i
            ans=max(ans,(right[i]-left[i]-1)*heights[i]);
        }
        return ans;
    }
};
85. 最大矩形 题目

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

思路

dp求出每个点的leftMax,作为左边最大’1’的个数的条形统计图。
对同列的元素分别求柱状图中最大的矩形(84)

class Solution {
public:
    int maximalRectangle(vector>& matrix) {
        int m=matrix.size(),n=matrix[0].size();
        vector> left(m,vector(n,0));
        for(int i=0;i
            for(int j=0;j
                if(j==0||matrix[i][j]=='0'){
                    left[i][j]=matrix[i][j]-'0';
                }else{
                    left[i][j]=left[i][j-1]+1;
                }
            }
        }
        int ans=0;
        for(int j=0;j
            stack st;
            vector l(m,-1),r(m,m);
            for(int i=0;i
                while(!st.empty()&&left[i][j]
                    int tmp=st.top();
                    st.pop();
                    r[tmp]=i;
                }
                if(!st.empty()){
                    l[i]=st.top();
                }
                st.push(i);
            }
            for(int i=0;i
                ans=max(ans,(r[i]-l[i]-1)*left[i][j]);
            }
        }
        return ans;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号