首页 > 编程语言 >leetcode热题100(84. 柱状图中最大的矩形)c++

leetcode热题100(84. 柱状图中最大的矩形)c++

时间:2025-01-03 11:00:22浏览次数:3  
标签:柱子 int 递增 c++ 柱状图 矩形 热题 单调

链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)

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

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

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

思路

        我们求最大的一个矩形面积,那么如果在柱子连续递增的情况,此时最短的柱子的右长度一定是单调递增的个数了,左边的长度肯定是就是上个单调递增的值的下标到现在坐标的长度了,所以我们只需要设置一个单调栈来记录单调递增的数组的位置,要是遇到比栈顶元素小就计算,枚举一下最大值即可

代码

class Solution {
public:
    int largestRectangleArea(vector<int>& a) {
        a.push_back(0); //避免没计算,最后一个元素设置为0
        int n = a.size();
        a.insert(a.begin(),0);  //避免前面元素位置为0,不好计算
        stack<int> st; 
        int res = 0;
        for(int i=0;i<=n;i++){
            while(st.size()>1 && a[i]<a[st.top()]){ //遇到比栈顶小元素
                int cur = a[st.top()];  //当前柱子的大小
                st.pop();   //弹出
                int l = st.top();   //上个栈顶的柱子大小
                int r = i;  //遇到更小的元素的位置
                int len = r-l-1;    //长度
                //cout<<len<<" "<<cur<<endl;
                res = max(cur*len,res);
            }
            st.push(i);
        }

        return res;
    }
};

标签:柱子,int,递增,c++,柱状图,矩形,热题,单调
From: https://blog.csdn.net/qq_63707333/article/details/144904572

相关文章

  • C++基础之移动语义(Move Semantic)
    文章目录引言Move语义的定义与优点示例:拷贝和移动操作应用场景Move后的变量自定义类中如何支持MoveMove语义的误区`std::move`并不移动数据移动后继续使用对象对整型或者布尔类型无效总结参考链接引言在现代C++中,Move语义通过优化资源管理和减少内存......
  • C++程序设计谭浩强第四版-第十一章
    第十一章类的继承(面向对象的程序设计)面向对象程序的4大特点抽象封装继承多态派生类(子类)是基类(父类)的具体化,基类是派生类的抽象类的继承:一个新类从已有的类那里获得其已有特性派生:从已有的类(父类)产生一个新的子类class派生类名:[继承方式]基类名{......
  • C++11 thread线程的使用
    C++11thread线程的使用文章目录C++11thread线程的使用构造函数1.`thread()noexcept=default;`2.`thread(thread&)=delete;`3.`thread(constthread&&)=delete;`4.`thread(thread&&__t)noexcept`5.`template<typename_Callable,typename..._Args&g......
  • leetcode热题100(394. 字符串解码)c++
    链接:394.字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格......
  • <<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>
    目录类的定义访问限定符 类域实例化实例化的概念 类的定义class为定义类的关键字,Date为类的名字(类名就相当于类型),{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员......
  • 【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思
    文章目录常见位运算1.位1的个数2.比特位计数3.汉明距离4.只出现一次的数字5.只出现一次的数字III6.只出现一次的数字II7.判定字符是否唯一8.丢失的数字9.两整数之和10.只出现一次的数字II常见位运算判断一个数的二进制表示的第x位是0还是1(n>>x)&1......
  • DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题(修复 0xc000007b 错误
    DirectX修复工具V4.3绿色增强版:完美解决DirectX和C++问题简介DirectX修复工具是一款专为检测和修复DirectX问题而设计的实用工具。它能够精准定位问题并进行高效修复,特别是针对0xc000007b错误,拥有极高的修复成功率。本工具支持所有版本DirectX修复,同时增强版还额......
  • C++返回值优化 RVO 和 NRVO
    RVO(ReturnValueOptimization)指的是当函数返回一个临时对象时,编译器会尝试直接将这个临时对象构建在调用者提供的存储空间中,而不是先创建一个临时对象再进行复制。这样就可以避免一次复制操作,提高效率。如:MyClassfunc(){returnMyClass();//返回一个临时对象}......
  • 只谈C++11新特性 - 显式转换函数
    显式转换函数背景与问题在C++11之前,explicit关键字只能用于构造函数。其作用是阻止构造函数在需要隐式转换时被调用。例如:示例问题(C++11之前的explicit用法)#include<iostream>classExample{public:explicitExample(intvalue){std::cout<<......
  • C++中的仿函数
    梅花芳香四溢,我们一往无前文章目录一、仿函数的定义二、仿函数的特性三、仿函数的相对性能优势总结一、仿函数的定义在C++中,仿函数(Functors)或称为函数对象(FunctionObjects)是重载了调用操作符operator()的类或结构体,这使得这些类的对象可以像函数一样被调用。仿......