求最大子矩陣的大小

2022-04-06 00:31:46 字數 1817 閱讀 8223

【說明】:

本文是左程雲老師所著的《程式設計師面試**指南》第一章中「求最大子矩陣的大小」這一題目的c++復現。

感謝左程雲老師的支援。

【題目】:

給定乙個整型矩陣 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。

【思路】:

簡單已經不足以描述了,請參考左老師的原書。

【編譯環境】:

centos6.7(x86_64)

gcc 4.4.7

【實現】:

實現及測試**:

1/*2

*檔名:maxrecsize.cpp34

*摘要:使用c++實現最大子矩陣的問題5*/

67 #include 8 #include 9 #include 10

11using

namespace

std;

1213

int maxrecfrombottom(int count,int

len)

1430

s.push(i);31}

32while(!s.empty())

3341

return

maxarea;42}

4344

int maxrecsize(int **mat,const

int length,const

intheight)

4556 cout << "

--------

"<

57 maxarea =max(maxrecfrombottom(count,length),maxarea);58}

59return

maxarea;60}

6162

intmain()

63,,};

65 cout << "

maxrecsize is :

"<< maxrecsize((int **)mat,4,3) <

66return0;

67 }

view code

【說明】

1、一維陣列初始化時碰到乙個問題:

我宣告的原**為:

int count[length] = ;               // 錯誤:可變大小的物件『count』不能被初始化

後改為:

int *count = new int[length]();        //這種情況就可以實現內將為count分配的記憶體初始化為0

關於c++中使用 new 時,陣列初始化的問題請參考:[c++]陣列初始化

重點:(錯誤:iso c++ 不允許在陣列 new 中初始化)new陣列只能用無參的建構函式或者所有引數都有預設值的建構函式,new(new的陣列版)要求元素物件的型別必須具有預設建構函式(內建型別的「預設建構函式」是什麼也不做),否則將不能使用new。

2、二維指標做形參的問題請參考:[總結]c語言二維陣列作為函式的引數

3、使用二維指標訪問二維陣列時需要注意的請參考:二維陣列和二級指標

注:

求最大子矩陣的大小

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

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

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