leetcode Maximal Rectangle

题目要求:给定一个矩阵,元素只有0和1,求一个面积最大的矩形!

        ///思路一:看成是每一行向上可以延伸到多远,然后求以这个为底边的一个最大矩形,就是一个单调栈问题了!
        /////思路二:预处理height[i][j]数组表示向上i,j可以到达多远,left[i][j]表示height[i][j]这条线段向左可以
        ////到达多远,right表示向右  答案就是max(height[i][j]*(right[i][j]-left[i][j]+1))
思路二的解法:

class Solution {

public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        int n = matrix.size();
        if(n==0)return 0;
        int m = matrix[0].size();
        if(m==0)return 0;
        vector< vector<int> > height(n);
        vector< vector<int> > left(n);
        vector< vector<int> > right(n);
        for(int i = 0;i<n;i++){
            height[i].resize(m);
            left[i].resize(m);
            right[i].resize(m);
        }
        int ans = 0;
        for(int i = 0;i<n;i++){
            int lo =-1,ro = m;
            for(int j = 0;j<m;j++){
                if(matrix[i][j]=='0'){
                    height[i][j] = left[i][j] = 0;
                    lo = j;
                }else {
                    height[i][j] = i==0?1:height[i-1][j]+1;
                    left[i][j] = i==0?lo+1:max(left[i-1][j],lo+1);
                }
            } 
            for(int j = m-1;j>=0;j--){
                if(matrix[i][j]=='0'){
                    right[i][j] = m;
                    ro = j;
                }else {
                    right[i][j] =i==0?ro-1:min(right[i-1][j],ro-1);
                    ans = max(ans,height[i][j]*(right[i][j]-left[i][j]+1));
                }
            }
        }
        return ans;
    }

};

思路一的解法:

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
       /* int n = matrix.size();
        if(n==0)return 0;
        int m = matrix[0].size();
        if(m==0)return 0;
        vector< vector<int> > height(n);
        vector< vector<int> > left(n);
        vector< vector<int> > right(n);
        for(int i = 0;i<n;i++){
            height[i].resize(m);
            left[i].resize(m);
            right[i].resize(m);
        }
        int ans = 0;
        for(int i = 0;i<n;i++){
            int lo =-1,ro = m;
            for(int j = 0;j<m;j++){
                if(matrix[i][j]=='0'){
                    height[i][j] = left[i][j] = 0;
                    lo = j;
                }else {
                    height[i][j] = i==0?1:height[i-1][j]+1;
                    left[i][j] = i==0?lo+1:max(left[i-1][j],lo+1);
                }
            } 
            for(int j = m-1;j>=0;j--){
                if(matrix[i][j]=='0'){
                    right[i][j] = m;
                    ro = j;
                }else {
                    right[i][j] =i==0?ro-1:min(right[i-1][j],ro-1);
                    ans = max(ans,height[i][j]*(right[i][j]-left[i][j]+1));
                }
            }
        }
        return ans;*/
        int n = matrix.size();
        if(0==n)return 0;
        int m = matrix[0].size();
        if(0==m)return 0;
        vector<vector<int> > height(2);
        height[0].resize(m);
        height[1].resize(m);
        int loca = 0;
        stack<int>  s;
        int ans = 0;
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                if(i==0){
                    height[loca][j] = matrix[0][j]-'0';
                }else {
                    if(matrix[i][j]=='0')height[loca][j] = 0;
                    else height[loca][j] = height[1-loca][j]+1;
                }
                if(s.empty()){
                    s.push(j);
                }else {
                    while(!s.empty() && height[loca][s.top()]>height[loca][j]){
                        int h = s.top();
                        s.pop();
                        if(!s.empty()){
                            ans = max(ans,height[loca][h]*(j-1-s.top()));
                        }else ans = max(ans,height[loca][h]*j);
                        
                    }
                    s.push(j);
                }
            }
            while(!s.empty()){
                int h = s.top();
                s.pop();
                if(!s.empty()){
                    ans = max(ans,height[loca][h]*(m-1-s.top()));
                }else ans = max(ans,height[loca][h]*m);
            }
            loca = 1-loca;
        }
        return ans;
    }
};

思路一采用了滚动数组,加一个单调栈,和思路二的方法相比于少了很多空间!单调栈这里就不说了!

猜你喜欢

转载自blog.csdn.net/sysucph/article/details/17266119