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; }