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 };
View Code
原文地址:https://www.cnblogs.com/jostree/p/4052721.html