棧和佇列 求最大子矩陣的大小

2021-08-08 22:12:06 字數 2066 閱讀 8077

【題目】

給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大的矩形區域為1的數量。

例如:

1 0 1 1

1 1 1 1

1 1 1 0

其中,最大的矩形區域有6個1,所以返回6.

【題目】

如果矩陣的大小是o(n*m),本題可以做到時間複雜度為o(n*m)。

1、矩陣的行數是n,以每一行做切割,統計以當前行作為底的情況下,每個位置往上連續1的數量。使用高度陣列height來表示。

例如:

map = 1 0 1 1

1 1 1 1

1 1 1 0

以第一行做切割後,height = .

以第二行做切割後,height = .

以第三行做切割後,height = .

2、對於height陣列,我們可以將其想象成乙個直方圖,要求最大的子矩陣,實際上就是對以每一行為底的直方圖,其最大矩陣面積。如果我們能求出以每乙個柱子擴充套件出去的最大矩形,那麼其中最大的矩形就是我們想要的。

如果要求乙個柱子a擴充套件出去的最大矩形,實際上就是求這個柱子左邊第乙個比它低的柱子b以及右邊第乙個比它低的柱子c,那麼b和c之間的柱子數×a柱子的高度,就是答案。問題的關鍵就在於如何快速的找到柱子b和c。方法如下:

使用乙個棧,從左到右遍歷陣列height,假設遍歷到的位置為i,如果棧為空或者棧頂所對應的元素小於height[i],直接將 i 壓入棧中;否則將棧中大於height[i]的元素全部出棧,然後壓入 i。對於棧中的每乙個元素,左邊第乙個比它小的數的位置就是棧中上乙個元素,右邊第乙個比它小(或者等於)的數的位置就是使它出棧的數的位置,如果沒有數使它出棧,說明它右邊沒有比它小的數。

以[1,3,2]為例,首先1入棧,接下來3比1大,直接入棧,並且確定了3左邊第乙個比它小的數是1;接下來2比3小,3出棧,同時可以確定3右邊第乙個比它小的數是2;接下來2比1大,2入棧,並且確定了2左邊第乙個比它小的數是1。此時棧中的元素為[1,2],沒有數使它們出棧,所以1和2右邊都沒有比它小的數。

【**實現】

#python3.5

defmaxrecsize

(map):

defmaxrecfrombottom

(height):

if height == none

or len(height) == 0:

return

0 stack =

maxarea = 0

for i in range(len(height)):

while stack and height[stack[-1]] >= height[i]:

j = stack.pop()

k = stack[-1] if stack else -1

maxarea = max(maxarea, (i-k-1) * height[j])

while stack:

j = stack.pop()

k = stack[-1] if stack else -1

maxarea = max(maxarea, (len(height)-k-1) * height[j])

return maxarea

if map == none

or len(map) == 0

or len(map[0]) == 0:

return

0 height = [0

for i in range(len(map[0]))]

maxarea = 0

for i in range(len(map)):

for j in range(len(map[0])):

height[j] = 0

if map[i][j] == 0

else height[j] + 1

maxarea = max(maxarea, maxrecfrombottom(height))

return maxarea

棧與佇列8 求最大子矩陣的大小

給定乙個整形矩陣map,其中的值只有0和1,求其中全是1的所有矩形區域中,最大的矩形區域中1的數量,例如 1 1 1 0,其中最大的矩形區域有3個1,返回3.再如 1 0 1 1 1 1 1 1 1 1 1 0 其中,最大的矩形區域有6個1,返回6 如果矩陣大小為o n m 可以做到時間複雜度為o ...

求最大子矩陣的大小

給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...

求最大子矩陣的大小

題目 給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩陣區域中,最大的矩形區域為1的數量。思路 步驟1 矩陣的行數為n,以每一行做切割,統計以當前行作為底的情況下,每個位置往上的1的數量。使用高度陣列height來表示。例如 map 1 0 1 1 1 1 1 1 1 1 1 0...