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

 

你可能感兴趣的:(LeetCode)