?LeetCode刷題實(shí)戰(zhàn)85: 最大矩形
算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !
今天和大家聊的問題叫做?最大矩形,我們先來看題面:
https://leetcode-cn.com/problems/maximal-rectangle/
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.
題意

解題
題解
暴力


的規(guī)模,顯然是我們不能接受的。分析問題

["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
class Solution:
????def maximalRectangle(self, matrix: List[List[str]]) -> int:
????????# 求出行數(shù)n和列數(shù)m
????????n = len(matrix)
????????if?n == 0:
????????????return?0
????????m?= len(matrix[0])
??# 存儲(chǔ)每一層的高度
????????height = [0?for?_ in range(m+1)]
????????res?= 0
????????# 遍歷以哪一層作為底層
????????for?i in range(n):
????????????sk = [-1]
????????????for?j?in range(m+1):
????????????????# 計(jì)算j位置的高度,如果遇到0則置為0,否則遞增
????????????????h = 0?if?j?== m?or?matrix[i][j] == '0'?else?height[j] + 1
????????????????height[j] = h
????????????????# 單調(diào)棧維護(hù)長度
????????????????while?len(sk) > 1?and?h < height[sk[-1]]:
????????????????????res?= max(res, (j-sk[-2]-1) * height[sk[-1]])
????????????????????sk.pop()
????????????????sk.append(j)
????????return?res
總結(jié)
上期推文:
