力扣 1139 最大的以 1 為邊界的正方形

2021-10-09 07:01:21 字數 2203 閱讀 4407

給你乙個由若干 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,...