题目
给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大矩形区域为1的数量。
要求
时间复杂度达到O(mn)
具体思路请参考原书
代码
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
int maxRecFromBottom(int* height, int len)
{
if (height == NULL)
return 0;
int maxArea = 0;
stack<int> s;
for (int i = 0; i < len; i++)
{
while (!s.empty() && height[i] <= height[s.top()])
{
int j = s.top();
s.pop();
int k = s.empty() ? -1 : s.top();
int curArea = (i - k - 1) * height[j];
maxArea = max(maxArea, curArea);
}
s.push(i);
}
while (!s.empty())
{
int j = s.top();
s.pop();
int k = s.empty() ? -1 : s.top();
int curArea = (len - k - 1) * height[j];
maxArea = max(maxArea, curArea);
}
return maxArea;
}
int maxRecSize(int* map, int m, int n)
{
if (map == NULL || m == 0 || n == 0)
return 0;
int maxArea = 0;
int* height = new int[n];
for (int i = 0; i < n; i++)
height[i] = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
height[j] = map[i * n + j] == 0 ? 0 : height[j] + 1;
}
maxArea = max(maxRecFromBottom(height, n), maxArea);
}
return maxArea;
}
int main()
{
int m, n;
cin >> m >> n;
int* map = new int[m * n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> map[i * n + j];
}
}
int maxA = maxRecSize(map, m, n);
cout << maxA << endl;
getchar();
return 0;
}