当前位置: 首页 > article >正文

力扣-单调栈-84 柱状图中最大的矩形

思路和时间复杂度

  1. 思路:利用单调栈找到比当前元素小的第一个元素,此时在栈中的元素顺序从栈头到栈底是递降的,然后栈顶元素的下一个元素,就是比当前元素小的前一个元素,这样计算以当前元素(栈顶)作为高的矩形有多大即可。
  2. 时间复杂度: O(n)      

代码

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        stack<int> st;
        st.push(0);

        int res = 0;
        for(int i = 1; i < heights.size(); i++){
            if(heights[i] > heights[st.top()]){
                st.push(i);
            }else if(heights[i] == heights[st.top()]){
                st.pop();
                st.push(i);
            }else{
                // 栈口元素找到右侧第一个比栈口元素小的i
                while(!st.empty() && heights[i] < heights[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        int left = st.top();
                        res = max(res, heights[mid] * (i - left - 1));
                    }
                }
                st.push(i);
            }
        }
        return res;
    }
};


http://www.kler.cn/a/579912.html

相关文章:

  • Leetcode-整数反转
  • 每日学Java之一万个为什么
  • 分布式事务的原理
  • 网络安全之tcpdump工具
  • 隐私保护在 Facebook 内容审核系统中的应用
  • 机器学习篇——决策树基础
  • python采集京东商品详情数据,API接口文档说明
  • Elasticsearch 7.x入门学习-系统架构与工作流程
  • 人工智能直通车系列13【机器学习基础】(线性回归模型实现scikit - learn)
  • 图论——差分约束
  • 贪心算法三
  • Android Glide 框架线程管理模块原理的源码级别深入分析
  • C++基础算法:高精度
  • 项目-苍穹外卖(二)增加用户+用户分页查询
  • BUUCTF [GUET-CTF2019]soul sipse 1
  • K8S 集群搭建——cri-dockerd版
  • KUKA机器人:智能制造的先锋力量
  • 深入理解 HTML 中的段落与折行
  • Java数据结构第十九期:解构排序算法的艺术与科学(一)
  • 【Ubuntu系统设置固定内网ip,且不影响访问外网 】