Day13-leetcode85

今天的题很值得思考并且值得动手把程序码一遍。

今天这题解法比较多

但我用了单调栈

将问题转化为了前几天写过的一道题进行求解。

85. 最大矩形

(1)题目描述

85. 最大矩形icon-default.png?t=M85Bhttps://leetcode.cn/problems/maximal-rectangle/description/

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

示例 1:

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。

示例 2:

输入:matrix = []
输出:0

示例 3:

输入:matrix = [["0"]]
输出:0

示例 4:

输入:matrix = [["1"]]
输出:1

示例 5:

输入:matrix = [["0","0"]]
输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 1 <= row, cols <= 200
  • matrix[i][j] 为 '0' 或 '1'

做题分析:

用自己的话解释题意:

给你一个二维的由字符‘0’‘1’构成的矩阵,在这其中找到一个全部为‘1’的最大矩阵的面积。


开始思考解决方法:

刚开始看到这道题的时候

讲真的,我的第一时间是想到了动态规划

但是后来一直没找到合适的这题的状态转移

换个思路思考:

因为我们找的是这个图形里的矩阵的面积

我们其实可以想到前几天有一道题:84.柱状图中最大的矩形

这道题就是在给定的柱状图里找到能组成的最大的面积。

那两道题的不同点在于:

我们今天做的题是一个矩阵,并且每一行的情况都不一样

那这个不同点促成了什么呢

该题的柱形,不一定靠着底部!!!!

那我们针对于这个思路继续针对性的求解

如何解决我们的柱形不靠着底部呢?

那我们就针对性的把每一行都当一次底!

那其实这道题就基本解决了

解决思路是这样的:

我们针对于每一行都当一次水平面

然后将其水平面上的柱状图的高度保存下来

用单调栈进行求解每一行的柱状图最大面积即可。

如果单调栈的用法有些疑虑的话,可以看一看我之前的84题的题解(知乎)

csdn力扣84个人题解

那我接下来讲一下我写的过程中出现的错误

希望可以帮助到大家:

1、这个矩阵不是N*N的,不是!不是!不是!(我刚开始没看清一直错误)

2、每次算完一行之后,栈一定要清空!清空!清空!!!(没清空的话会可能导致自己的单调栈的数组出问题)

(调试问题的注释我就不删了,大家也可以试试)

代码如下:

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int rows=matrix.size(),cols=matrix[0].size();
        int height[cols],ans=0,right_min[cols],left_min[cols];
        stack<int>l;
        stack<int>r;
        for(int i=0;i<cols;i++)height[i]=0;
        for(int i=0;i<rows;i++){
            stack<int>().swap(l);
            stack<int>().swap(r);//*****stack栈必须要初始化,否则可能遗留
            for(int j=0;j<cols;j++){
                if(matrix[i][j]=='1'){
                    height[j]+=1;
                }
                else height[j]=0;
            }
            for(int j=0;j<cols;j++){
                right_min[j]=cols;
                while(!r.empty()&&height[r.top()]>height[j]){
                    right_min[r.top()]=j;
                    r.pop();
                }
                r.push(j);
            }
            for(int j=cols-1;j>=0;j--){
                left_min[j]=-1;
                while(!l.empty()&&height[l.top()]>height[j]){
                    left_min[l.top()]=j;
                    l.pop();
                }
                l.push(j);
            }
            for(int j=0;j<cols;j++){
                //cout<<height[j]<<" ";
                //cout<<left_min[j]<<","<<right_min[j]<<"="<<(right_min[j]-left_min[j]-1)*height[j]<<" ";
                ans=max(ans,(right_min[j]-left_min[j]-1)*height[j]);
            } /**/   
            //cout<<endl;
        }
        return ans;
    }
};

二、总结及计划

今天能够独立写出来这道题

感觉不错的

继续继续。

难度上来了。

接下来会更努力。

好,完美结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值