Maximal Rectangle 题解
题目描述
即寻找矩阵S
中最大的被1
填充的矩形子块面积
。矩形子块s
的面积
即字面义:矩形子块s
的面积。
如:S
=
[1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0]
最大的矩形子块面积
为6
,此矩形子块s
=[1 1 1; 1 1 1]
。
题解
Largest Rectangle in Histogram的变形。可以这么转换,二维的矩形的横轴对应Histogram的长度,纵轴对应Histogram的高度。从左到右,从上到下遍历一次即可。假设矩阵大小为n * n
,时间复杂度为O(n^2)
,空间复杂度为O(n)
。
代码
typedef unsigned int uint;
static const uint MAX_SIZE = 0x100;
static uint keep[MAX_SIZE], heights[MAX_SIZE];
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
size_t rect = 0U;
memset(heights, 0, sizeof(heights));
for (size_t i = matrix.size(); i--; ) {
const vector<char>& vec = matrix[i];
size_t len = vec.size(), keepEnd = 0;
for (keep[0] = len; len--; keep[++keepEnd] = len) {
heights[len] = vec[len] == '0'? 0 : heights[len] + 1;
uint tmp = heights[len], pos = keep[keepEnd];
do {
uint area = heights[pos];
if (tmp >= area)
break;
pos = keep[--keepEnd];
if ((area *= (pos - len - 1U)) > rect)
rect = area;
} while (keepEnd);
}
while (keepEnd) {
uint area = heights[keep[keepEnd]];
if ((area *= keep[--keepEnd]) > rect)
rect = area;
}
}
return rect;
}
};
总结
主要应用了等价转化的思想。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。