leetcode84柱状图中最大的矩形

小灰灰 2022-10-06 06:52 290阅读 0赞

在这里插入图片描述
在这里插入图片描述
思路:
在这里插入图片描述

  1. 使用单调递增栈,横向的长度是找到当前柱子左边第一个比它小的,和右边第一个比它小的,长度是两个小柱子的中间位置
    (1)如果新元素比栈顶元素大就入栈
    (2)如果新元素比较小,就将栈内的元素一直弹出,直至栈顶比新元素小
  2. 每次遇到比栈顶小的元素时才更新,那么为了计算最后一个数字,将0压入栈。
  3. 单弹出时栈为空,说明该栈顶元素是[0,i]的最小元素,其面积为heights[s.top()]*i,其他时候则是left = 该栈顶元素最左边边界值并包括该边界值,right = 当前值的左边位置并包括该位置
    (1)left = s.back()+1 ;right = i-1;weight=right-left+1
  4. 代码模板

    stack st;
    for(int i = 0; i < nums.size(); i++)
    {

    1. while(!st.empty() && st.top() > nums[i])
    2. {
    3. st.pop();
    4. //left;
    5. //right;
    6. }
    7. st.push(nums[i]);

    }

代码

  1. int largestRectangleArea(vector<int>& heights) {
  2. vector<int> s;
  3. int i;
  4. int res = 0;
  5. heights.push_back(0);
  6. for(i=0;i<heights.size();++i){
  7. while (!s.empty()&&heights[s.back()]>heights[i])
  8. {
  9. int h = heights[s.back()];
  10. s.pop_back();
  11. if(s.empty()){
  12. res =max(res,i*h);
  13. }
  14. else {
  15. res = max(res,(i-s.back()-1)*h);
  16. }
  17. }
  18. s.push_back(i);
  19. }
  20. return res;
  21. }

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 84. 矩形

    思路: 单调栈    维护一个单调上升的栈。因为保证单调上升以后,从后面开始,每一个都可以作为高。为了方便计算宽度。先压入一个-1即可。 宽度计算的原理:取当前栈顶的元素