我能想到的dp算法:
dp[i][j]表示包含第i行第j列的元素往上走的连续的1的个数;这是可以递推的if
dp[i][j]=v[i][j]==0?0:dp[i-1][j]+1(i>=1);
对于dp中的每行遍历可以计算出结果;目测空间复杂度为o(n)(可以用1个一维数组代替)和时间复杂度o(n*n)。。
优快云真是神仙排版,还是我打开的方式不对??
很惨烈的结果hhhhh 觉得getMax这个函数还可以优化;根据以前学过的单调栈。
class Solution {
public:
int getMaxByIndex(vector<int>v, int i) {
int Max = v[i];
if (v[i] == 0)
return 0;
int left = i-1;
int right = i+1;
while (left >= 0 && v[left] >= v[i]) {
Max += v[i];
left--;
}
while (right < v.size() && v[right] >= v[i]) {
Max += v[i];
right++;
}
return Max;
}
int getMax(vector<int>v) {
int Max = 0;
for (int i = 0; i < v.size(); i++) {
if (v[i] == 0)
continue;
if(i==0)
Max = getMaxByIndex(v, 0);
if (i != 0 && v[i] != v[i - 1]) {
int tem = getMaxByIndex(v, i);
Max = Max > tem ? Max : tem;
}
}
return Max;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int Max = 0;
int N = matrix.size();
if (N == 0)
return 0;
int M = matrix[0].size();
//cout << N << "-------" << M << endl;
vector<int>v1(M,0);
// vector<int>v2(M,0);
//初始化
for (int i = 0; i < M; i++) {
v1[i] = matrix[0][i]-'0';
}
Max = getMax(v1);
for (int i = 1; i < N; i++) {
for (int j = 0; j < M; j++) {
v1[j] = matrix[i][j] == '0' ? 0 : v1[j] + 1;
}
Max = max(Max,getMax(v1));
//v1 = v2;
//cout << Max << endl;
}
return Max;
}
};