給你乙個由若干 0 和 1 組成的二維網格 grid,請你找出邊界全部由 1 組成的最大 正方形 子網格,並返回該子網格中的元素數量。如果不存在,則返回 0。
示例 1:
輸入:grid = [[1,1,1],[1,0,1],[1,1,1]]
輸出:9
示例 2:
輸入:grid = [[1,1,0,0]]
輸出:1
1 <= grid.length <= 100
1 <= grid[0].length <= 100
grid[i][j] 為 0 或 1
思路:1.如何遍歷完所有可能正方形?
每個正方行都僅有乙個右下點,我們只需遍歷每個右下點的最大正方行格仔,記錄最大便可
2.如何計算每一右下點(前提為1)的最大正方形?
我們先找出以此點向左連續為1的長度,向上連續為1的長度
兩點的最小數必是 此點的最大可能正方形邊長size
之所以是可能,是因為我們還不知道左邊和上邊是否全為一,僅知道下邊和右邊連續為1的公共最大長度
3.下面我們就找左邊上邊的公共最大長度:
所以我們要從此點左邊,相距size-1點檢測他的上邊連續為為1的長度是否大於size-1
此點上邊,相距size-1點檢測他的左邊連續為1的長度是否大於size-1
如果任一不成立,我們就檢查左邊,上邊size-2,長度是否大於size-2
依次迴圈直到成立,此點最大正方形面積為(size-n+1)**2
演算法實現:
所以我們必須先建立乙個三位陣列,儲存每點左邊和上邊最大連續為一的長度
gd[h][l][0]:表示第h行,l列的點左邊連續為1的點數 (包含自身)
gd[h][l][1]:表示第h行,l列的點上邊連續為1的點數(包含自身)
我們同時發現,i,j點如果為1,那麼他的左邊連續為1的最大長度便是gd[i-1],[j][0]+1
那麼他的上邊連續為1的最大長度便是gd[i],[j-1][1]+1
這種有上乙個點的狀態,可以轉化出下乙個點狀態,便是動態規劃
**:
class
solution
:def
largest1borderedsquare
(self, grid: list[list[
int]])
->
int:
h=len(grid)
l=len(grid[0]
) ma_x=
0#生成三位矩陣
gd=[[
[0]*
2for i in
range
(l+1)]
for i in
range
(h+1)]
#計算每個點連續左邊,上邊最大長度,同時計算出每點最大面積
for i in
range(1
,h+1):
for j in
range(1
,l+1):
#如果此點為1
if grid[i-1]
[j-1]:
#有左邊點,上邊點動態轉換得到
gd[i]
[j][1]
=1+gd[i-1]
[j][1]
gd[i]
[j][0]
=1+gd[i]
[j-1][
0]#公共最長邊長
size=
min(gd[i]
[j][0]
,gd[i]
[j][1]
)#計算此非零點最大正方形面積
while1:
size-=
1#由大到小,成立記錄最大值,退出
if gd[i-size]
[j][0]
>size and gd[i]
[j-size][1
]>size:
ma_x=
max(ma_x,
(size+1)
**2)break
return ma_x
此題的難點在於:
要用動態規劃生成三位陣列記錄最大右邊,上邊長,同是還要迴圈檢測左邊,上邊長是否符合
邊界為1的最大子方陣
思路如下,先建立乙個三維輔助陣列,第一第二位存放矩陣的行和列的下標,第三位0時,存放 當前位置向右連續共有幾個1,第三位為1時,存放當前位置向下連續共有幾個1。由於矩陣的最後一列的元素,它的底下為空,所以要先單獨提取出來,為最後一行三維陣列第三個元素向右向左單獨賦值。此後的元素賦值類似最後一列,還是...
力扣485 最大連續1的個數
給定乙個二進位制陣列,計算其中最大連續1的個數。輸入 1,1,0,1,1,1 輸出 3 解釋 開頭的兩位和最後的三位都是連續1,所以最大連續1的個數是 3.注意 輸入的陣列只包含 0 和1。輸入陣列的長度是正整數,且不超過 10,000。刷到這道題的第一印象就是和之前的力扣053 最大子序和非常相似...
藍橋杯 邊界為1的最大子方陣(預處理)
其中,邊框全是1的最大正方形的大小是4 4,故返回4。這道題我之前還寫過一篇採用暴力搜尋法來解決的,但是時間複雜度比較大o n 4 可能會超時,沒看過的小夥伴可以看下 暴力搜尋版 此處我們先對這個矩陣進行預處理,有點類似於動態規劃,思路就是新建乙個n n 2的三維陣列,其中規定,每乙個元素如果是1,...