力扣算法题—084柱状图中最大的矩形

给定 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 }

 

posted @ 2019-04-20 15:09  自由之翼Az  阅读(451)  评论(0编辑  收藏  举报