求解最大矩形

问题

largest rectangle in histogram

求解

使用一个vector存储一个递增的高度数组,保证每次可以直接从最后面进行取数,直到最前面。
当后面存在一个更高的高度的时候,此时必然存在一个更低的高度作为边界,始终保持一个小的
边界就可以了。

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int solute(vector<int>&heights) {
int ret = 0;
vector<int>v;
heights.push_back(0);
for (int i = 0; i < heights.size(); i++) {
while (v.size() && heights[v.back()] >= heights[i]) {
int h = heights[v.back()];
v.pop_back();
int l = v.empty() ? -1 : v.back();
ret = max(ret, h*(i - l - 1));
}
v.push_back(i);
}
return ret;
}

拓展

max rectangle

和上面一题不同的在于此时是在一个二维的情况,所以需要对每一行进行存储,转换为高度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
vector<int>v(matrix[0].size(), 0);
int ans = 0;
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == '0') v[j] = 0;
else v[j]++;
}
ans = max(ans, solute(v));
}
return ans;
}
int solute(vector<int>&heights) {
int ret = 0;
vector<int>v;
heights.push_back(0);
for (int i = 0; i < heights.size(); i++) {
while (v.size() && heights[v.back()] >= heights[i]) {
int h = heights[v.back()];
v.pop_back();
int l = v.empty() ? -1 : v.back();
ret = max(ret, h*(i - l - 1));
}
v.push_back(i);
}
return ret;
}
};