zoukankan      html  css  js  c++  java
  • leetcode-Largest Rectangle in Histogram

     1 #include <iostream>
     2 #include <stack>
     3 #include <vector>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 class Solution2
     8 {
     9 public:
    10     int largestRectangleArea(vector<int> &height) {
    11         height.push_back(0);
    12         int i = 0;
    13         int result = 0;
    14         stack<int> s;
    15         while (i < height.size())
    16         {
    17             if (s.empty() || height[i]>height[s.top()])
    18                 s.push(i++);
    19             else
    20                 //已经发现下标[i]的元素比栈顶元素(也就是下标[i-1]的元素)小了,所以栈顶元素(即[i-1]号)无法向右延伸了。
    21                 //因此可以将其弹出了,并计算向左能延伸多远。
    22                 
    23             {
    24                 int tmp = s.top();
    25                 s.pop();
    26                 result = max(result, height[tmp] * (s.empty() ? i:i-s.top()-1));
    27             }
    28         }
    29         return result;
    30     }
    31 };
    32 
    33 
    34 
    35 
    36 
    37 class Solution {
    38 public:
    39     int largestRectangleArea(vector<int> &height) {
    40         stack<int> s;
    41         height.push_back(0);//将0硬插入数组作为最后一个直方图高度值,从而在i遍历到最后时能把栈中剩余的元素全弹出来。
    42         int result = 0;
    43         for (int i = 0; i < height.size();) {
    44 
    45             //只有i所遍历到的元素大于栈顶元素时才能入栈,相等都不行,以保证当前的栈顶元素是独一无二的孤峰,【直接相邻的】左右元素都比它小,这样它就没法左右延伸了
    46             //每次都是针对出栈的栈顶元素,看该元素对应的直方柱能左右延伸多远、最大构成多大的矩阵。
    47             if (s.empty() || height[i] > height[s.top()])//这里是将i所指的值与栈顶元素比,不是与直接相邻的上一个元素比。
    48                 s.push(i++);
    49             else {
    50                 int tmp = s.top();
    51                 s.pop();
    52                 //(1)要想通一点:站在当前处理的元素的角度来看,对于那些之前入过栈又跳出去的元素,肯定都是比自己值大的。
    53                 //(2)栈中元素都是单调递增的。
    54                 //(3)当向右没法延伸时(i所指元素不再大于当前栈顶元素)就开始出栈,并通过【i-s.top()-1】得出向左延伸时能延伸多远(s.top()即向左延伸时第一个比自己值小的立柱的x坐标。比自己值大的不可能还在栈内。)
    55                 //从而计算当前出栈元素所能参与构成的最大矩阵。
    56                 //(4)i-1所指的元素必定是当前的栈顶元素
    57                 result = max(result, height[tmp] * (s.empty() ? i : i - s.top() - 1));
    58             }
    59         }
    60         return result;
    61     }
    62 };
    63 int main()
    64 {
    65     Solution s;
    66     int a[] = { 1, 2, 4, 3, 2, 4 };
    67     vector<int> v(a, a + 6);
    68     cout << s.largestRectangleArea(v) << endl;
    69     return 0;
    70 }
  • 相关阅读:
    一个简单的禁止鼠标滚轮事件处理
    模仿抽奖转盘,并且用cookie记录历史次数
    学习jquery
    使用var提升变量声明
    Django 自带密码加密,自定密码加密方式 及自定义验证方式
    kindEditor使用并防止xss攻击(day88)
    python二维码生成库(qrcode)简介和实例
    js原型的区别
    js中 this与that
    python单元测试之unittest框架使用总结
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4021208.html
Copyright © 2011-2022 走看看