【說明】:
本文是左程雲老師所著的《程式設計師面試**指南》第一章中「求最大子矩陣的大小」這一題目的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/*2view code*檔名: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 }
【說明】
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,以每...