85 最大矩形

2022-05-08 22:27:07 字數 2152 閱讀 4646

這題用到了前面84的思路,我先計算了乙個陣列,記錄每一行從當前元素起有幾個連續的1。然後對於每一列(從右到左,不過其實想想從左到右也沒區別,當時想多了)把行數0~n-1作為橫座標,每個元素對應的連續1的長度作為高度,整體逆時針旋轉90度就變成了84題求柱狀圖最大矩形的問題。對於每一列用遞增棧o(n),共n列,總體複雜度o(n^2)。

class solution:

def maximalrectangle(self, matrix) -> int:

area=0

m=len(matrix)

if not m:

return 0

n=len(matrix[0])

#m行n列

#算乙個陣列d,d[i,j]記錄第i行第j列開始往後有幾個連續的1

d=[[0 for i in range(n)] for j in range(m)]

for i in range(m):

#每行最後乙個元素單拎出來

if matrix[i][-1]=='1':

d[i][-1]=1

for j in range(n-2,-1,-1):

#每行倒序進行

if matrix[i][j]=='1':

d[i][j]=d[i][j+1]+1

else:

d[i][j]=0

for col in range(n):

stack=

row=0

while row=d[stack[-1]][col]:

#棧空或當前高度比棧頂大則入棧

row+=1

else:

k=stack.pop()

area=max(area,((row-stack[-1]-1)if stack else row)*d[k][col])

while stack:

k=stack.pop()

area=max(area,((row-stack[-1]-1)if stack else row)*d[k][col])

return area

翻用時翻到大佬的,用二進位制移位做,看都看了半天。。

給的陣列只有1和0,先把每一行用join函式改為字串再轉為十進位制數字,然後對於任意存在的矩形,設起始行為i,末尾行為j,必然應該滿足i行與i+1到j的每一行的&(與)運算不為0,(兩行與運算為0表示這兩行不存在相同的位置都為1,則這兩行顯然構不成矩形),而j是從i+1開始往下遍歷,若遇到某一行與i的與運算為0,則後面的就不用迴圈了,相當於有點dp的思想。然後

while tmp:

tmp &= (tmp << 1)

cnt += 1

這一句是計算tmp的二進位制串中有幾位連續的1,考慮其中最長連續的1有4個,每次tmp左移一位,再與它原本的值進行與運算,那麼這四位最左一位就移出去了,右邊的三位進行與運算結果還是三個1,然後再迴圈一次,剩下兩個1,以此類推。

class solution:

def maximalrectangle(self, matrix) -> int:

if not matrix or not matrix[0]:

return 0

nums = [int(''.join(s), 2) for s in matrix]

print(nums)

n = len(nums)

area = 0

for i in range(n):

num = nums[i]

for j in range(i, n):

num &= nums[j]

if not num: #做與運算結果為0意味i行為0的j行必為1或為0

#剩下的內層for迴圈也沒必要繼續了

break

cnt, tmp = 0, num

#下面這個while是計算tmp中有幾個連續的1,真牛逼

while tmp:

tmp &= (tmp << 1)

cnt += 1

#cnt是當前矩形的橫向的最大長度

#(j-i+1)為當前矩形的高

area = max(area, cnt * (j - i + 1))

return area

大佬??

85 最大矩形

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6 方法 按層分割法 思路 按層生成從頭部開始,生成每一層的柱狀圖,然後求得改層的所能達到的最大面積,直到遍歷完...

85 最大矩形

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6 使用柱狀圖 棧 defmaximalrectangle matrix if not matrix retur...

85 最大矩形

高度更新的過程 邊界的更新 這種方法和常規的動態規劃有差別,沒有常規的dp矩陣定義。但是在行向下變化的時候,也是利用之前的狀態。class solution object def update self,i,j,dp length dp i j 0 height dp i j 1 area 0 fo...