即尋找序列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