zoukankan      html  css  js  c++  java
  • 【LeetCode】85. Maximal Rectangle

    Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.

    如果用DP来做,判断(begin1,end1)~(begin2,end2)范围是否全1,会超时。

    对于矩阵matrix,逐行构建height数组,调用Largest Rectangle in Histogram即可。

    对matrix第i行构建height数组方法:对于height[j],即从matrix[i][j]开始,最多到达matrix[0][j]的连续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 < matrix.size(); i ++)
            {
                vector<int> height(n, 0);
                for(int j = 0; j < n; j ++)
                {
                    int r = i;
                    while(r >= 0 && matrix[r][j] == '1')
                    {
                        height[j] ++;
                        r --;
                    }
                }
                ret = max(ret, largestRectangleArea(height));
            }
            return ret;
        }
        
        int largestRectangleArea(vector<int> &height) {
            if(height.empty())
                return 0;
                
            int result = 0;
            stack<int> s;   //elements in stack s are kept in ascending order
            int ind = 0;
            while(ind < height.size())
            {
                if(s.empty() || height[ind]>=s.top())
                {
                    s.push(height[ind]);
                }
                else
                {
                    int count = 0;  //pop count
                    while(!s.empty() && height[ind]<s.top())
                    {
                        int top = s.top();
                        s.pop();
                        count ++;
                        result = max(result, count*top);
                    }
                    for(int i = 0; i <= count; i ++)
                        s.push(height[ind]);    //push count+1 times
                }
                ind ++;
            }
            //all elements are in stack s, and in ascending order
            int count = 0;
            while(!s.empty())
            {
                count ++;
                int top = s.top();
                s.pop();
                result = max(result, count*top);
            }
            
            return result;
        }
    };

  • 相关阅读:
    原型
    构造函数
    异常处理
    逻辑中断
    1. 两数之和
    面向对象(进阶篇)
    面向对象(初级篇)
    面向对象
    迭代器/生成器
    模块&字符格式化
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4148350.html
Copyright © 2011-2022 走看看