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

刷题day54:柱形图中最大矩形

题意描述:

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

 暴力方法:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        int result = 0;
        for(int i = 0; i < n; i++){
            int height = heights[i];
            int left = i, right = i;
            while(left - 1 >= 0 && heights[left - 1] >= height){
                left--;
            }
            while(right + 1 < n && heights[right + 1] >= height){
                right++;
            }
            result = max(result, (right - left + 1) * height);
        }
        return result;
    }
};

复杂度为O(n*n)。会超时

利用单调栈思路:

首先单调栈的代码如下:

stack<int> st;
for(int i = 0; i < nums.size(); i++)
{
	while(!st.empty() && st.top() > nums[i])
	{
		st.pop();
	}
	st.push(nums[i]);
}

单调栈:维护一个单独递增的栈,只有放入元素比栈顶元素大才入栈,否则一直pop +计算最大面积。栈中初始化一个0,数组的末尾添加一个元素0,这样才能计算所有的情况(或者说清空栈)。

以heights = [2,1,5,6,2,3]为例说明:.

加入0后heights =  [0, 2,1,5,6,2,3, 0];

heights[i]栈中元素下标当前矩形最大面积操作情况
heights[0] = 0s = [0]00入栈
heights[1] = 2s = [0,1]01入栈
heights[2]=1 < 2s=[0]2

栈顶元素1出栈

面积= 2*(2-0-1)=2

heights[3]=5s=[0,2,3]23入栈
heights[4]=6s=[0,2,3,4]24入栈
heights[5]=2<heights[4]=6s=[0,2,3]6

4出栈

面积= 6*(5-3-1) = 6

heights[5]=2<heights[3]=5s=[0,2]10

3出栈

面积= 5*(5-2-1) = 10

2>heights[2]=1s=[0,2,5]105入栈
heights[6]=3s=[0,2,5,6]106入栈
heights[7]=0 < heights[6]=3s=[0,2,5]10

6出栈

面积= 3*(7-5-1) = 3

heights[7]=0< heights[5]=2s=[0,2]10

5出栈

面积= 2*(7-2-1) = 8

heights[7]=0< heights[2]=1s=[0]10

2出栈

面积= 1*(7-0-1) = 6

heights[7]=0s=[0,7]输出10

完整C++代码如下:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        int result = 0;
        heights.insert(heights.begin(), 0);
        heights.emplace_back(0);
        for(int i = 0; i < heights.size(); i++){
            while(!st.empty() && heights[st.top()] > heights[i]){
                int height = heights[st.top()];
                st.pop();
                int width = i - st.top() - 1;
                result = max(result, height * width);
            }
            st.push(i);
        }
        return result;
    }
};


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

相关文章:

  • 记录日志中logback和log4j2不能共存的问题
  • 【CICD】GitLab Runner 和执行器(Executor
  • Python的Web请求:requests库入门与应用
  • 由播客转向个人定制的音频频道(1)平台搭建
  • mysql 快速解决死锁方式
  • Linux——gcc编译过程详解与ACM时间和进度条的制作
  • Java多线程基础面试总结(一)
  • 【数据挖掘与商务智能决策】第十一章 AdaBoost与GBDT模型
  • 数字孪生智慧应急怎么实现?
  • 运行时内存数据区之虚拟机栈——操作数栈
  • 你真正了解低代码么?(国内低代码平台状况分析)
  • 国家出手管人工智能AI了
  • Python数据分析案例24——基于深度学习的锂电池寿命预测
  • Difference between HTTP1.0 and HTTP1.1
  • Spring 之依赖注入底层原理
  • like字符通配符%_、查询空值、去重、and、or、MySQL数据库 - 单表查询(二)(头歌实践教学平台)
  • 【数据结构】栈各个接口的实现
  • 详解AUTOSAR:Green Hills Software(GHS)集成DaVinci Configurator生成的代码(RH850)(环境配置篇—1)
  • springboot+vue学生选课管理系统
  • 循环依赖详解及解决方案
  • 闭包和继承
  • 程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了
  • GDPU C语言 天码行空7
  • 代码随想录算法训练营第五十五天 | 392. 判断子序列、115. 不同的子序列
  • 【grafana】使用多级变量解决Granfana模板变量中的大小限制
  • RHCE——shell脚本练习