题目
代码(7.15 首刷看解析)
DP
三层for循环,暴力,方法和Leetcode 221. 最大正方形差不多。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
int res = 0;
vector<vector<int>> dp(m, vector<int>(n));
for(int i = 0; i < m; i++) { // 先求出最长宽度
for(int j = 0; j < n; j++) {
if(matrix[i][j] == '1')
dp[i][j] = (j == 0 ? 0 : dp[i][j-1]) + 1;
res = max(res, dp[i][j]);
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(dp[i][j] == 0) continue;
int width = dp[i][j];
for(int k = i - 1; k >= 0; k--) {
width = min(width, dp[k][j]);
res = max(res, width * (i - k + 1));
}
}
}
return res;
}
};
单调栈
方法和Leetcode 84. 柱状图中最大的矩形(⭐⭐⭐⭐⭐)一样,这84题这个模板需要好好背住。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(matrix[i][j] == '1')
dp[i][j] = (i == 0 ? 0 : dp[i-1][j]) + 1;
}
}
int res = 0;
for(int i = 0; i < m; i++)
res = max(res, largestRetangleArea(dp[i]));
return res;
}
int largestRetangleArea(vector<int> area) {
stack<int> stk;
area.insert(area.begin(), 0);
area.push_back(0);
stk.push(0);
int res = 0;
for(int i = 1; i < area.size(); i++) {
if(stk.empty() || area[i] >= area[stk.top()])
stk.push(i);
else {
while(!stk.empty() && area[i] < area[stk.top()]) {
int mid = stk.top();
stk.pop();
if(!stk.empty()) {
int r = stk.top();
int w = i - r - 1;
res = max(res, w * area[mid]);
}
}
stk.push(i);
}
}
return res;
}
};
代码(10.5 二刷自解)
和84题一样的,用单调栈
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(matrix[i][j] == '1') {
dp[i][j] = 1 + (i == 0 ? 0 : dp[i-1][j]);
}
}
}
int res = 0;
for(auto& m : dp) {
res = max(res, getMaxRectangle(m));
}
return res;
}
int getMaxRectangle(vector<int>& matrix) {
matrix.insert(matrix.begin(), 0);
matrix.emplace_back(0);
stack<int> sk;
sk.push(0);
int res = 0;
for(int i = 1; i < matrix.size(); i++) {
while(!sk.empty() && matrix[sk.top()] > matrix[i]) {
int height = matrix[sk.top()];
sk.pop();
int len = i - sk.top() - 1;
res = max(res, len*height);
}
sk.push(i);
}
return res;
}
};