【題目】給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩陣區域中,最大的矩形區域為1的數量。
思路:
步驟1:矩陣的行數為n,以每一行做切割,統計以當前行作為底的情況下,每個位置往上的1的數量。使用高度陣列height來表示。
例如:map =
1 0 1 1
1 1 1 1
1 1 1 0
1).以第一行做切割後,height=,height[j]表示目前底上(第一行),j位置往上(包括j位置)有多少連續的1。
2).以第二行做切割後,height=, 注意從第一行到第二行,height陣列的更新是十分方便的,即height[j] =map[i][j] == 0 ? 0 : height[j] + 1。
3).以第三行做切割後,height=。
步驟2:對於每一次切割,都用更新後的height陣列來求出每一行為底的情況下,最大的矩形是什麼。那麼多次切割下,最大的那個矩形就是我們要的。對於height陣列,可以理解為乙個直方圖,步驟2的實質就是在乙個大的直方圖中求最大矩形的面積,如果我們能求出以每一根柱子擴充套件出去的最大矩形,那麼其中的最大的矩形就是我們想找的,具體步驟見maxrecfrombottom()方法。
public
class
maxsubmatrix
int maxarea =0;
int[
] height =
newint
[map[0]
.length]
;for
(int i =
0; i < map.length; i++
) maxarea = math.
max(maxarea,
maxrecfrombottom
(height));
}return maxarea;
}public
static
intmaxrecfrombottom
(int
height)
int maxarea =0;
stack
stack =
newstack
();for
(int i =
0; i < height.length; i++
) stack.
push
(i);
}while
(!stack.
isempty()
)return maxarea;
}}
求最大子矩陣的大小
給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...
求最大子矩陣的大小
說明 本文是左程雲老師所著的 程式設計師面試 指南 第一章中 求最大子矩陣的大小 這一題目的c 復現。感謝左程雲老師的支援。題目 給定乙個整型矩陣 map,其中的值只有 0 和 1 兩種,求其中全是1的所有矩形區域中,最大的矩形區域為1的數量。例如 1 1 1 0 其中,最大的矩形區域有 3 個 1...
棧和佇列 求最大子矩陣的大小
題目 給定乙個整型矩陣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,以每...