zoukankan      html  css  js  c++  java
  • 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.

    思路:本题给你包含0和1的矩阵,让你找出包含1的最大矩阵,并返回其面积。这道题可以枚举出所有矩阵求出其中的最大面积,如果枚举出高度和宽度,时间复杂度要到O(n^4)了,那么我们可以这样从矩阵的左上角的位置开始,这样计算以某一点为左上角的矩阵的最大面积。

    1.高度为1时,宽度为第一行中从第一个位置起连续的1的个数,这样求出其面积

    2.高度为2时,宽度为第二行中从第一个位置其连续的1的个数,宽度为其最小值,这样求出面积

    3.一次类推,宽度为和上一行宽度的最小值。

    我们可以使用动态规划方程来计算每一行的连续1的个数,我们从每一行的尾部算起。

    初始状态:dp[i][col-1]=(matrix[i][col-1]=='1);dp[i][j]=((matrix[i][j]=='1')?1+dp[i][j]:0)

    最后,就是在三层for循环下,找出最大面积。

    class Solution {
    public:
        int maximalRectangle(vector<vector<char> > &matrix) {
            int row=matrix.size();
            if(row==0)
                return 0;
            int col=matrix[0].size();
            int dp[row][col];
            int result=0;
            memset(dp,0,sizeof(dp));
            for(int i=0;i<row;i++)
            {
                dp[i][col-1]=(matrix[i][col-1]=='1');
            }
            for(int i=0;i<row;i++)
            {
                for(int j=col-2;j>=0;j--)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp[i][j]=1+dp[i][j+1];
                    }
                    else
                        dp[i][j]=0;
                }
            }
            for(int i=0;i<row;i++)
            {
                for(int j=0;j<col;j++)
                {
                    if((row-i)*(col-j)<=result)//这里可以优化,直接跳过小于等于result的情况
                        break;
                    int width=dp[i][j];
                    for(int k=i;k<row&&width>0;k++)
                    {
                        if(width*(row-i)<=result)//这里可以优化,直接跳过小于等于result的情况
                            break;
                        width=min(width,dp[k][j]);
                        result=max(result,width*(k-i+1));
                    }
                }
            }
            return result;
        }
    };

     思路二:时间复杂度为O(n^2).借用Largest Rectangle in Histogram思想,将此题包含连续1的个数转化为直方图。

    class Solution {
    public:
        int MaxRectangle(vector<int> &height)
        {
            int len=height.size();
            if(len==0)
                return 0;
            stack<int> s;
            height.push_back(0);
            int maxArea=0;
            int area=0;
            for(int i=0;i<=len;)
            {
                if(s.empty()||height[s.top()]<=height[i])
                {
                    s.push(i);
                    i++;
                }
                else
                {
                    int k=s.top();
                    s.pop();
                    if(s.empty())
                        area=height[k]*i;
                    else
                        area=height[k]*(i-s.top()-1);
                    maxArea=max(maxArea,area);
                }
            }
            return maxArea;
        }
        int maximalRectangle(vector<vector<char> > &matrix) {
            int row=matrix.size();
            if(row==0)
                return 0;
            int col=matrix[0].size();
            vector<vector<int> > height(row,vector<int>(col,0));
            for(int i=0;i<row;i++)
            {
                for(int j=0;j<col;j++)
                {
                    if(i==0)
                    {
                        height[i][j]=(matrix[i][j]=='1');
                    }
                    else
                    {
                        height[i][j]=((matrix[i][j]=='1')?1+height[i-1][j]:0);
                    }
                }
            }
            int result=0;
            int area;
            for(int i=0;i<row;i++)
            {
                area=MaxRectangle(height[i]);
                result=max(result,area);
            }
            return result;
        }
    };
  • 相关阅读:
    从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
    从零搭建Spring Boot脚手架(3):集成mybatis
    从零搭建Spring Boot脚手架(2):增加通用的功能
    从零搭建Spring Boot脚手架(1):开篇以及技术选型
    Hibernate Validator校验参数全攻略
    Spring Data R2DBC响应式操作MySQL
    Spring Security 实战干货:从零手写一个验证码登录
    Spring Security 实战干货:图解用户是如何登录的
    基于.NetCore3.1系列 —— 日志记录之日志核心要素揭秘
    基于.NetCore3.1系列 —— 日志记录之日志配置揭秘
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3763214.html
Copyright © 2011-2022 走看看