LeetCode85——最大矩形

题目:

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

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

思路:

思路和上一题84基本是一样的,只不过这里的矩形条高度有很多组,dp数组每一次更新就是一个矩形条高度的数组。dp数组记录的是下一层相对于上一层,每个方块能达到的最大高度。所以要对求出的每一个dp数组分别求出最大矩形的高度。

 

代码:

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(!matrix.size()) return 0;
        vector<int> dp(matrix[0].size(),0);//dp用于记录以某一层为底,与之前的所有上层可以形成的连续高度
        int maxArea = 0;
        /*
        循环中调用amxRectangleArea()算法,
        用于找到在一层中结点matrix[i][j]完整包含dp[j]高度的最大宽度
        面积就等于找到的长 * 宽
        */
        for(int i=0;i<matrix.size();++i)
        {
            for(int j=0;j<matrix[0].size();++j)
            {
                dp[j] = (matrix[i][j]=='1') ? dp[j]+1 : 0;
            }
            maxArea=max(maxArea,maxRectangleArea(dp));
        }
        return maxArea;
    }
private:
    //84.柱状图中最大的矩形 的代码,
    //用于找到nums中完整包含当前高度的最长宽度
    int maxRectangleArea(vector<int> &nums)
    {
        stack<int> s;//单调栈
        nums.push_back(0);//设置一个哨兵,让nums遍历到最后时,获得的柱体高度可让单调栈前面的所有元素出栈
        int maxArea = 0;
        for(int i=0;i<nums.size();++i)
        {
            while(!s.empty() && nums[i]<=nums[s.top()])
            {
                int top = s.top();s.pop();
                maxArea = max(maxArea,nums[top]*(s.empty()?i:i-s.top()-1));
            }
            s.push(i);
        }
        nums.pop_back();
        return maxArea;
    }
};

发布了269 篇原创文章 · 获赞 3 · 访问量 8445

猜你喜欢

转载自blog.csdn.net/Xiao2018428/article/details/104684133
今日推荐