Largest Rectangle in Histogram 题解
题目描述
即寻找序列S
中最大的连续子序列矩形面积
。连续子序列s
的矩形面积
定义:min{s[i]|0<i<=len(s)} * len(s)
。
如:S
=[2,1,5,6,2,3]
,最大的连续子序列矩形面积
为10
,此连续子序列s
=[5,6]
。
题解
遍历所有连续子序列并计算其矩形面积
,而后取最大值即可。时间复杂度为O(n^2)
,空间复杂度为O(1)
。但存在重复计算,可对此部分进行优化。转化成另一种形式的遍历:对每个可能的min{s[i]|0<i<=len(s)}
进行遍历。而后取此时满足条件的最大len(s)
即可。前者即序列的每个取值S[i](0<i<=len(S))
,最大len(s)
=Right - Left - 1
。Right
满足(S[Right] < S[i] && Right > i)
,Left
满足(S[Left] < S[i] && Left < i)
。设置标兵:S[0]
= S[len(S) + 1]
= min{S[i]|0<i<=len(S)} - 1
。利用栈保存状态,时间复杂度为O(n)
,空间复杂度为O(n)
。
代码
typedef unsigned int uint;
static const uint MAX_SIZE = 0x8000;
static uint keep[MAX_SIZE];
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
size_t len = heights.size(), keepEnd = 0, rect = 0;
for (keep[0] = len; len--; keep[++keepEnd] = len) {
uint tmp = heights[len], pos = keep[keepEnd];
while (keepEnd) {
uint area = heights[pos];
if (tmp >= area)
break;
pos = keep[--keepEnd];
if ((area *= (pos - len - 1U)) > rect)
rect = area;
}
}
while (keepEnd) {
uint area = heights[keep[keepEnd]];
if ((area *= keep[--keepEnd]) > rect)
rect = area;
}
return rect;
}
};
总结
主要应用了等价转化的思想。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。