即寻找序列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)
。ui
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; } };
主要应用了等价转化的思想。spa