[LeetCode] Largest Rectangle in Histogram
This link has a very neat code, which is rewritten below using stack since the push
and pop
operations of it are O(1)
time, while the pop_back
and push_back
of vector
tend to be more time-consuming. This is also verified by the running time of the code on the OJ: stack
version is generally 4ms to 8ms faster than vector
version.
1 class Solution { 2 public: 3 int largestRectangleArea(vector<int>& height) { 4 height.push_back(0); 5 int n = height.size(), area = 0; 6 stack<int> indexes; 7 for (int i = 0; i < n; i++) { 8 while (!indexes.empty() && height[indexes.top()] > height[i]) { 9 int h = height[indexes.top()]; indexes.pop(); 10 int l = indexes.empty() ? -1 : indexes.top(); 11 area = max(area, h * (i - l - 1)); 12 } 13 indexes.push(i); 14 } 15 return area; 16 } 17 };
Moreover, it would be better to keep height
unmodified. So we loop for n + 1
times and manually set the h = 0
when i == n
. The code is as follows.
1 class Solution { 2 public: 3 int largestRectangleArea(vector<int>& height) { 4 int n = height.size(), area = 0, h, l; 5 stack<int> indexes; 6 for (int i = 0; i <= n; i++) { 7 while (i == n || (!indexes.empty() && height[indexes.top()] > height[i])) { 8 if (i == n && indexes.empty()) h = 0, i++; 9 else h = height[indexes.top()], indexes.pop(); 10 l = indexes.empty() ? -1 : indexes.top(); 11 area = max(area, h * (i - l - 1)); 12 } 13 indexes.push(i); 14 } 15 return area; 16 } 17 };
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步