【題目】
給定乙個整型矩陣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...