leetcode Maximal Rectangle 单调栈
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052721.html
题目链接:leetcode Maximal Rectangle 单调栈
该题目是 leetcode Largest Rectangle in Histogram 的二维版本,首先进行预处理,把一个n×m的矩阵化为n个直方图,然后在每个直方图中计算使用单调栈的方法计算面积最大的矩形,然后求得最大的矩形面积即可。
Ps:这题直接在网页里面敲完居然1A,不错。
代码如下:
1 class Solution { 2 public: 3 int mr(vector<int> arr) 4 { 5 arr.push_back(0); 6 stack<pair<int, int> > st;//height index 7 int res = 0; 8 for( int i = 0 ; i < arr.size() ; i++ ) 9 { 10 pair<int, int> tmp; 11 if( st.size() == 0 || st.top().first <= arr[i] ) 12 { 13 st.push(make_pair(arr[i], i)); 14 } 15 else 16 { 17 while( st.size() > 0 && st.top().first > arr[i] ) 18 { 19 tmp = st.top(); 20 st.pop(); 21 res = max(res, tmp.first*(i-tmp.second)); 22 } 23 st.push(make_pair(arr[i], tmp.second)); 24 } 25 } 26 return res; 27 } 28 int maximalRectangle(vector<vector<char> > &matrix) 29 { 30 int res = 0; 31 if( matrix.size() == 0 ) return 0; 32 vector<vector<int> > ma(matrix.size(), vector<int>(matrix[0].size(), 0)); 33 for( int i = 0 ; i < matrix[0].size(); i++ ) 34 { 35 if( matrix[0][i] == '1' ) ma[0][i] = 1; 36 } 37 for( int i = 1 ; i < matrix.size() ; i++ ) 38 { 39 for( int j = 0 ; j < matrix[0].size() ; j++ ) 40 { 41 if( matrix[i][j] == '1' ) 42 { 43 ma[i][j] = ma[i-1][j] + 1; 44 } 45 } 46 } 47 for( int i = 0 ; i < ma.size() ; i++ ) 48 { 49 res = max(res, mr(ma[i])); 50 } 51 return res; 52 } 53 };