给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
输入: [2,1,5,6,2,3] 输出: 10
在真实的面试中遇到过这道题?
1 #include "_000库函数.h" 2 3 //头尾指针,然后在寻找头尾指针中间最短的值 4 //貌似复杂度为n^2有点高 5 //超出时间限制 6 class Solution { 7 public: 8 int largestRectangleArea(vector<int>& heights) { 9 if (heights.empty())return 0; 10 if (heights.size() == 1)return heights[0]; 11 int max = -1; 12 for (int left = 0; left < heights.size(); ++left) { 13 int min = heights[left]; 14 for (int right = left; right < heights.size(); ++right) { 15 min = min < heights[right] ? min : heights[right]; 16 max = max > (min*(right - left + 1)) ? max : (min*(right - left + 1)); 17 } 18 } 19 return max; 20 } 21 }; 22 23 24 //使用局部峰值,即该数大于后一个数就是局部峰值, 25 //然后遍历前面所有的数字 26 27 // Pruning optimize 28 class Solution { 29 public: 30 int largestRectangleArea(vector<int> &height) { 31 int res = 0; 32 for (int i = 0; i < height.size(); ++i) { 33 if (i + 1 < height.size() && height[i] <= height[i + 1]) { 34 continue; 35 } 36 int minH = height[i]; 37 for (int j = i; j >= 0; --j) { 38 minH = min(minH, height[j]); 39 int area = minH * (i - j + 1); 40 res = max(res, area); 41 } 42 } 43 return res; 44 } 45 }; 46 47 //使用栈 48 //栈只存放数字下角标 49 //遇到比栈顶的数小的数则拿出来进行处理 50 class Solution { 51 public: 52 int largestRectangleArea(vector<int>& heights) { 53 int res = 0; 54 stack<int> st; 55 heights.push_back(0); 56 for (int i = 0; i < heights.size(); ++i) { 57 while (!st.empty() && heights[st.top()] >= heights[i]) { 58 int cur = st.top(); 59 st.pop(); 60 res = max(res, heights[cur] * (st.empty() ? i : (i - st.top() - 1))); 61 } 62 st.push(i); 63 } 64 return res; 65 } 66 }; 67 68 void T084() { 69 Solution s; 70 vector<int>v; 71 v = { 2,1,5,6,2,3 }; 72 cout << s.largestRectangleArea(v) << endl; 73 v = { 0,9}; 74 cout << s.largestRectangleArea(v) << endl; 75 }