LeetCode最大矩形

85. 最大矩形

给定一个仅包含 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

思路:

  只有要有上一题:84柱状图中最大矩形的基础,这道题完全就是送分题。

  这道题是求矩阵中的最大矩形,可以转化成求柱状图中的最大矩形。如何转化呢?对于n行的矩形,我们把它分成n部分来看。第一部分就是前一行,第二部分是前两行,第n部分就是前n行。

  对于每一个部分,底部为1就代表是一个柱子,从底向上有三个连续1就代表柱子的高为3。当然如果有一个0,就会导致柱子“断开”,就不算是柱子了。由此,每一部分都可以转化成求柱状图中最大矩形问题。

  “求柱状图中最大矩形代码”我们直接复用。我们只需要从上往下遍历矩阵,逐渐添加进新的行来组成新的部分,把新的部分送入“求柱状图中最大矩形代码”来得到结果,最终选出最大的结果即可。

代码:

class Solution(object):

def maximalRectangle(self, matrix):

    #默写一遍柱状图最大矩阵,整个函数一模一样

        def max_matrix_area(height):

            stack=[]

            lenth =len(height)

            left_res=[0]*lenth

            right_res=[0]*lenth

            for i in range(lenth-1,-1,-1):

                while(stack and height[stack[-1]]>=height[i]):

                    stack.pop()

                right_res[i] = stack[-1]-i if stack else lenth-i

                stack.append(i)

            height1 = height[::-1]

            stack=[]

            for i in range(lenth-1,-1,-1):

                while(stack and height1[stack[-1]]>=height1[i]):

                    stack.pop()

                left_res[i] = stack[-1]-i if stack else lenth-i

                stack.append(i)

            left_res=left_res[::-1]

            maxx=0

            for i,h in enumerate(height):

                maxx=max(maxx,(left_res[i]+right_res[i]-1)*h)

            return maxx

       #处理特殊情况

        if not matrix:

            return 0

        m = len(matrix)

        n = len(matrix[0])

        hei=[0]*n#hei用来模拟我们的柱状图

        total_res=0#存放总结果

        for i in range(m):#遍历每一层

            for j in range(n):#新部分的底部遍历一遍,得到每一个位置的“高度”

                if matrix[i][j]=='1':#只有是1,才可以继承上面的 +1

                    hei[j]+=1

                else:#如果当前是0,则中断,不能继承上面的

                    hei[j]=0

           #得到柱状图数组后,计算最大矩阵并尝试更新最大值

            total_res=max(total_res,max_matrix_area(hei))

        return total_res

小结:

       这道题完完全全可以复用84题柱状图中最大矩形的代码,只不过在外部加了点修改。其中我们从上到下遍历矩阵,每组成一个新的部分就有一个根据是否为1来判断是否可以和上面连起来组成柱子的操作,一旦是0则柱子肯定是断开的,高度也直接清零。把这个算是比较巧妙的过程弄懂之外,别的就只剩轻松利用之前代码了~

 

posted @   JunanP  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示