LeetCode算法打卡--最大面积

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

 

链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram

/*基本思路:先把能完全包含各个柱状图的矩形的最大面积求出来,然后求出其中最大值即可。
  要求能包含这个柱状图的最大面积,只要找他左边和右边第一个比他高度小的位置这个范围就是宽度
  用栈存储每一个高度
  当第i个柱子进栈时,如果栈顶柱子(此处记作柱子A)的高度低于或等于第i个柱子,则第i个柱子进栈;
  如果高于第i个柱子,则出栈,并计算以柱子A为高的矩形最大面积。
  参考https://blog.csdn.net/Zolewit/article/details/88863970
*/
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(0);
        int maxArea = 0;
        stack<int> st;
        int i;
        for(i=0;i<heights.size();i++)
        {
            while(!st.empty() && heights[i]<heights[st.top()])
            {
                int top = st.top();
                st.pop();
                maxArea = max(maxArea,heights[top]*(st.empty()?i:(i-st.top()-1)));
            }
            st.push(i);
        }
        return maxArea;
    }
};

85. 最大矩形

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

链接:https://leetcode-cn.com/problems/maximal-rectangle/

/*基本思想:把问题转化为求柱形图的最大面积的问题(leetcode 84题),对于每一行,都构造出一个柱状图(matrix有n列就有n个柱子,每一行都有一个temp,每个temp都求一个最大面积),求一个最大的面积,m行中找最大
   对于第i行的构造: 就是对于第j列,就是从当前的j开始到之前的到第0行的j中连续的1的个数(换句话说 matrix[i][j]=0,temp[j]=0,matrix[i][j]=1,temp[j]=从j的这个1开始向前的所有行的这一列和这个1连续的1的个数)
    
*/
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int ret = 0;
        if(matrix.empty()|| matrix[0].empty()){
            return ret;
        }
         
        int m = matrix.size();
        int n = matrix[0].size();
         
        for(int i = 0; i < m; i++){
            vector<int> temp(n, 0);
            for(int j = 0; j < n; j++){
                int r = i;
                while(r>=0 && matrix[r][j] == '1'){
                    temp[j]++;
                    r--;
                }
            }
         
            ret = max(ret, largestRectangleArea(temp));
        }
        
         
        return ret;
    }
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(0);
        int maxArea = 0;
        stack<int> st;
        int i;
        for(i=0;i<heights.size();i++)
        {
            while(!st.empty() && heights[i]<heights[st.top()])
            {
                int top = st.top();
                st.pop();
                maxArea = max(maxArea,heights[top]*(st.empty()?i:(i-st.top()-1)));
            }
            st.push(i);
        }
        return maxArea;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值