代码改变世界

leetcode - Maximal Rectangle

2013-04-28 18:47  张汉生  阅读(290)  评论(0编辑  收藏  举报

题目描述:点击此处

利用到前面的一个题目的函数。

 1 class Solution {
 2 public:
 3   int largestRectangleArea(int hgt[], int n) {
 4     // Start typing your C/C++ solution below
 5     // DO NOT write int main() function
 6     if (n<=0)
 7       return 0;
 8     bool * flag = new bool[n];
 9     int i, j;
10     for (i=0; i<n; i++){
11       flag[i] = false;
12     }
13     int rlt = 0;
14     for (i=0; i<n; i++){
15       if (flag[i])
16         continue;
17       if (rlt/(n-i) >= hgt[i])
18         continue;
19       int minH = hgt[i];
20       int area = hgt[i];
21       for (j=i+1; j<n; j++){
22         if (hgt[j] >= minH){
23           area += minH;
24         }
25         else{
26           flag[j] = true;
27           if (area>rlt)
28             rlt = area;
29           if (hgt[j]<=rlt/(n-i))
30             break;
31           minH = hgt[j];
32           area = hgt[j]*(j-i+1);
33         }
34       }
35       if (area>rlt)
36         rlt = area;
37     }
38     delete []flag;
39     return rlt;
40   }
41   int maximalRectangle(vector<vector<char> > &matrix) {
42     // Start typing your C/C++ solution below
43     // DO NOT write int main() function
44     if (matrix.size()<=0 || matrix[0].size()<=0){
45       return 0;
46     }
47     int m = matrix.size();
48     int n = matrix[0].size();
49     int i, j;
50     int ** ma = new int* [m];
51     i = 0;
52     for (vector<vector<char> > ::iterator vvci = matrix.begin(); vvci!=matrix.end(); vvci++){
53       ma[i] = new int[n];
54       j = 0;
55       for (vector<char>::iterator vci = (*vvci).begin(); vci!=(*vvci).end(); vci++){
56         if (*vci =='0')
57           ma[i][j] = 0;
58         else {
59           if (j>0)
60             ma[i][j] = ma[i][j-1] +1;
61           else ma[i][j] =1;
62         }
63         j++;
64       }
65       i++;
66     }
67     int * rowA = new int[m];
68     int rlt = 0;
69     for (i=0; i<n; i++){
70       for (j=0; j<m; j++)
71         rowA[j] = ma[j][i];
72       int temp = largestRectangleArea(rowA, m);
73       if (temp > rlt)
74         rlt = temp;
75     }
76     for (i=0; i<m; i++)
77       delete []ma[i];
78     delete []ma;
79     delete []rowA;
80     return rlt;
81   }
82 };