O(N)時間+O(N)空間複雜度。代碼以下:數組
int largestRectangleArea(vector<int>& heights) { if (heights.empty()) { return 0; } vector<int> bars; bars.push_back(0); int maxArea = 0; // 在原數組最後增長一個高度爲0的bar,這樣能夠保證最終全部在stack裏的bar都被彈出,而不需在循環結束時再單獨處理一遍stack裏的bar heights.push_back(0); for (int i = 1; i < heights.size(); i++) { int currentHeight = heights[i]; while (!bars.empty() && currentHeight <= heights[bars.back()]) { int k = bars.back(); int h = heights[k]; bars.pop_back(); // 處理剛彈出的bar k,假設前一個元素的index爲j,則bar的寬度w爲: 左邊寬度(k - j) + 右邊寬度(i - k -1) = i - j - 1. // 解釋: // 左邊從 k 到 j 是被bar k彈出的元素,顯然它們都比k高,加上k自己,寬度即爲k - j。 // 右邊是被新元素 i 彈出的元素,顯然他們也比 k 高,不然以前 k 就被它們彈出了。 int w = bars.empty() ? i : (i - bars.back() - 1); int area = h * w; maxArea = max(maxArea,area); } bars.push_back(i); } return maxArea; }