這題用到了前面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...