intlargestRectangleArea(vector<int>& heights){ int vsize = heights.size(); if (!vsize)return0; int res = heights[0]; for (int i = 0; i < vsize; i++) { if (i&&heights[i - 1] >= heights[i]) continue; int low = heights[i]; for (int j = i; j < vsize; j++) { low = heights[j] < low ? heights[j] : low; int area = (j - i + 1)*low; res = area > res ? area : res; } } return res; }
看了官方解析,觉得自己数据结构还是没学好。
单调递增栈操作规则
如果新的元素比栈顶元素大,就入栈
如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小
思路
对于一个高度,如果能得到向左和向右的边界
那么就能对每个高度求一次面积
遍历所有高度,即可得出最大面积
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
intlargestRectangleArea(vector<int>& heights) { int ans = 0; vector<int> st; heights.insert(heights.begin(), 0); heights.push_back(0); for (int i = 0; i < heights.size(); i++) { while (!st.empty() && heights[st.back()] > heights[i]) { int cur = st.back(); st.pop_back(); ans = max(ans, (i-1 - st.back()) * heights[cur]); } st.push_back(i); } return ans; }