即寻找矩阵S
中最大的被1
填充的矩形子块面积
。矩形子块s
的面积
即字面义:矩形子块s
的面积。
如:S
=segmentfault
[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]
。ui
Largest Rectangle in Histogram的变形。能够这么转换,二维的矩形的横轴对应Histogram的长度,纵轴对应Histogram的高度。从左到右,从上到下遍历一次便可。假设矩阵大小为n * n
,时间复杂度为O(n^2)
,空间复杂度为O(n)
。spa
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; } };
主要应用了等价转化的思想。code