首页 > 其他分享 >[LeetCode] 85. Maximal Rectangle_Hard tag: Dynamic Programming

[LeetCode] 85. Maximal Rectangle_Hard tag: Dynamic Programming

时间:2023-09-14 09:03:05浏览次数:43  
标签:Maximal right matrix Hard Programming cur height range left

Given a rows x cols binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

 

Example 1:

Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 6
Explanation: The maximal rectangle is shown in the above picture.

Example 2:

Input: matrix = [["0"]]
Output: 0

Example 3:

Input: matrix = [["1"]]
Output: 1

 

Constraints:

  • rows == matrix.length
  • cols == matrix[i].length
  • 1 <= rows, cols <= 200
  • matrix[i][j] is '0' or '1'.

 

思路参考solution,用3个n size 的array:

height: height[i] 表明当前row的第i个元素往上走最高的height

left:left[i] 表明当前row的第i个元素height 的left most index; 相当于 for k in [left[i], i] s.t height[k] >= height[i]

right: right[i] 表明当前row的第i个元素height 的right most index; 相当于 for k in [i, right[i]] s.t height[k] >= height[i]

each area = height[i] * (right[i] - left[i] + 1)

Code:

class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        m, n = len(matrix), len(matrix[0])
        left = [0] * n
        right = [n - 1] * n
        height = [0] * n
        ans = 0

        for i in range(m):
            cur_left, cur_right = 0, n - 1
            # update height
            for j in range(n):
                if matrix[i][j] == '1':
                    height[j] += 1
                else:
                    height[j] = 0
            # update left, when matrix[i][j] == '1', we need to compare cur_left with last row left most index, which is left[i]
            for j in range(n):
                if matrix[i][j] == '1':
                    left[j] = max(cur_left, left[j])
                else:
                    left[j] = 0
                    cur_left = j + 1
            # update right
            for j in range(n - 1, -1, -1):
                if matrix[i][j] == '1':
                    right[j] = min(cur_right, right[j])
                else:
                    right[j] = n - 1
                    cur_right = j - 1
            # update the area
            for j in range(n):
                ans = max(ans, height[j] * (right[j] - left[j] + 1))
        return ans

 

标签:Maximal,right,matrix,Hard,Programming,cur,height,range,left
From: https://www.cnblogs.com/Johnsonxiong/p/17701330.html

相关文章

  • CF1867E2 Salyg1n and Array (hard version)
    其实如果你在做E1的时候想到正解了,这道题都甚至不需要改E1的代码,直接交就好,这大概也是E2的分还没E1的高的原因。因为一摸一样的思路,所以这里就不作介绍了,可以看看我的题解。在这里呢,主要是稍微证明一下询问次数不会超,如下:可以发现,有余数的情况,只会增加两次询问,而后面的......
  • The 2020 ICPC Asia Shenyang Regional Programming Contest DFIK
    The2020ICPCAsiaShenyangRegionalProgrammingContest-CodeforcesDFIKD.JourneytoUn'Goro思路:思维+搜索一开始以为是构造,好吧但是是搜索。我们先考虑什么时候是最大值?首先考虑,题目要求我们从\(i->j\)且红色的数量是奇数被认为是好的。那么我们考虑记录\(p......
  • 2022-2023 ACM-ICPC German Collegiate Programming Contest (GCPC 2022)
    A.AlternativeArchitecture当倾斜放置时,一定可以构成直角三角形。枚举高用勾股定理算出底,然后在利用相似三角形即可算出另一条构成的直角三角形的边长,此时判断边是否都是整数即可。原图实际上点在格子上,一个常见的套路是边减一就可以转换成点在定点上。#include<bits/stdc+......
  • 2018-2019 9th BSUIR Open Programming Championship
    I.EqualModSegments\(1\leqn\leq1e5\)\(1\leqa_i\leq3e5\)题解:ST表+扫描线+二维偏序取模存在一个不错的性质:\(x\%p\)要么\(x\)不变,要么\(x\)至少整除\(2\)所以我们考虑固定左端点\(l\),存在\(log\a_l\)段区间,使得右端点\(r\)在每段区间\([p,q]\)内\(......
  • 2019-2020 ACM-ICPC Brazil Subregional Programming Contest
    D.DenouncingMafia给定一颗树,然后给定\(k\)个起点,对于每个起点来说,从该点到根节点的一条链都会被染色,求最多有几个点会被染色\(3\leqn\leq1e5,1\leqk\leqn\)题解我们贪心的来看,起点一定会选择在叶子节点,假设叶子节点的数量为\(cnt\),所以如果\(k\geqcnt\),那么......
  • 2022 Hubei Provincial Collegiate Programming Contest G. Brick(gym103729)
    大意给出底层高度,用1*2的砖块将总形状铺成等高矩形,使得高度最小(不能放在外面)题解奇妙做法当高度同奇偶时显然x可以的话x+2也可以,直接加一层竖的,所以首先分奇偶二分高度有解的必要条件1是,把矩形黑白方格染色之后未填的黑=白(一个1*2刚好覆盖1黑1白)然后从左往右放砖块,可以感受......
  • 2019 ICPC Universidad Nacional de Colombia Programming Contest
    A.Amazon给定\(n\)条直线(存在共线的情况),在每两条垂直的直线的交点处需要建一个交叉点,求交叉点的数量,注意需要去除共线时候的交叉点题解因为要除去共线的情况,我们考虑将一条直线以方向向量\(v\),与\(x\)轴的交点的横坐标\(x\)的方式存储注意:对于\(v\)来说需要最简形......
  • LeetCode297:hard级别中最简单的存在,java版,用时击败98%,内存击败百分之九十九
    本篇概览因为欣宸个人水平有限,在刷题时一直不敢面对hard级别的题目,生怕出现一杯茶一包烟,一道hard做一天的窘境这种恐惧心理一直在,直到遇见了它:LeetCode297,建议不敢做hard题的新手们速来围观,拿它练手,轻松找到自信题目简介二叉树的序列化与反序列化序列化是将一个数据......
  • 【题解】CF1854A2 Dual (Hard Version)
    你考虑我们A1只需要通过自加凑一个最大的数,然后将所有的数都变成正数,最后做一次前缀和即可。(不懂可以看看落谷题解)好,我们现在去看HardVersion的\(31\)次操作怎么分配:前缀和(全为正)/后缀和(全为负)——\(19\)次还剩下\(12\)次,不知道该怎么做。我们的目标便变......
  • 2022 International Collegiate Programming Contest, Jinan Site AEKM
    2022InternationalCollegiateProgrammingContest,JinanSite-CodeforcesAEKMA.Tower思路:思维+贪心由于我们只能进行\(+1,-1\)和\\(2\)的操作。显然的,我们能大幅度改变一个数是除\(2\)的操作,并且最后化成的一样的那个数一定不会大于当且的任何一个数,因为这样肯定......