求最大子矩陣的大小

2021-09-09 07:10:42 字數 1310 閱讀 3497

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