zoukankan      html  css  js  c++  java
  • 力扣算法题—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 }
  • 相关阅读:
    Gridview利用DataFormatString属性设置数据格式
    Sqlserver 字符串操作
    解决“网络不存在或尚未启动”
    ASP.NET中Url重写后,打不开真正的Html页面
    jquery 清空表单
    Sqlserver2005远程访问
    FCKeditor 在Ie中弹出“未知工具栏项目”的暂时解决方法
    表单成功提交了,点后退显示网页过期
    找不到方法:“Void System.Web.UI.HtmlControls.HtmlForm.set_Action(System.String)”。
    LINQ 标准的查询操作符 设置操作符号 两个结果集的 并、交、差、唯一
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10741006.html
Copyright © 2011-2022 走看看