leetcode 85. 最大矩形

问题描述

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

代码1

从下图可以看出这题是84. 柱状图中最大的矩形的推广,一个技巧是从上开始计算层数,这样rect可以由上一层的rect直接推出:

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int m = matrix.size();
        if(m == 0)return 0;
        int n = matrix[0].size(),i,j;
        int ans = 0;
        vector<int> rect(n,0);
        for(i = 0; i < m; ++i)
        {
            for(j = 0; j < n; ++j)
            {
                rect[j] = matrix[i][j] == '0'?0:++rect[j];
            }
            ans = max(ans,findmaximalRect(rect)); 
        }
        return ans;
    }
    int findmaximalRect(vector<int> &rect)
    {
        int n = rect.size(),maxarea = 0,i;
        stack<int> st;
        for(i = 0; i < n; ++i)
        {
            while(!st.empty() && st.top()>= rect[i])
            {
                int cur = st.top();
                st.pop();
                maxarea = max(maxarea,rect[cur]*(st.empty()?i:i-st.top()-1));
            }
            st.push(i);
        }
        return maxarea;
    }
};

结果:

执行用时 :24 ms, 在所有 C++ 提交中击败了75.81%的用户
内存消耗 :11.7 MB, 在所有 C++ 提交中击败了19.61%的用户

还有一种直接遍历的解法,没有想明白,留待后面补充。

posted @ 2020-03-02 08:47  曲径通霄  阅读(110)  评论(0编辑  收藏  举报