• 力扣算法题—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 }
  • 相关阅读:
    一百一十:CMS系统之剩余菜单栏的页面和视图
    一百零九:CMS系统之前端根据不同权限渲染不同菜单
    一百零八:CMS系统之封装权限判断功能
    一百零七:CMS系统之权限和角色模型定义
    一百零六:CMS系统之修改邮箱功能完成
    一百零五:CMS系统之flask-mail使用和邮箱配置、发送邮件功能
    一百零四:CMS系统之修改邮箱界面
    一百零三:CMS系统之使用sweetalert提示框优化返回结果
    一百零二:CMS系统之sweetalert提示框和使用
    一百零一:CMS系统之自定义restful风格json返回格式和内容
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10741006.html
Copyright © 2020-2023  润新知