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 }
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4021208.html
Copyright © 2011-2022 走看看