首页 > 其他分享 >84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

时间:2024-11-11 14:42:55浏览次数:1  
标签:heights wid int st 柱状图 ans 矩形 84 left

  1. 题目链接

  2. 解题思路:

    • 题目乍一看没有思路,那我们来想一想如果暴力求解怎么办。最大的矩形,他总有一个高(竖着的),然后有一个宽(横着的),那我们就暴力求解每一个高,也就是每一个下标i,对应的heights[i],最大的宽是多少,然后求出所有的解后,最优的便是结果。
    • 怎么求解以heights[i]为高,最大的宽是多少?用单调栈。单调栈是啥?简单来说就是,求i左边,比i「小的,离i最近的」在哪,求i右边,比i「小的,离i最近的」在哪。(当然,也可以求大的)
    • 所以,我们就可以得到以heights[i]为高,然后得出最大的宽,这就是其中之一的结果。把所有结果得到之后,求最大的那个,就是最终的结果。
  3. 代码

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            stack<int> st;    // 栈底到栈顶是小到大   存的是下标
            int ans = 0;
            int n = heights.size();
            for (int i = 0; i < n; ++i) {
                while(!st.empty() && heights[i] < heights[st.top()]) {
                    int wid_right = i;    // 宽的右边界
                    int wid_left = 0;   // 宽的左边界
                    int height = heights[st.top()];   // 高
                    st.pop();
                    if (!st.empty()) {    // 如果栈不为空  它下面压着的  就是左边 比他小 离他最近的
                        wid_left = st.top() + 1;
                    }
                    ans = max(ans, (wid_right - wid_left) * height);
                }
                st.push(i);
            }
            // 栈不空
            while(!st.empty()) {
                int wid_right = n;    // 宽的右边界  右边没有比当前栈顶小的了
                int wid_left = 0;    // 宽的左边界
                int height = heights[st.top()];
                st.pop();
                if (!st.empty()) {
                    wid_left = st.top() + 1;
                }
                ans = max(ans, (wid_right - wid_left) * height);
            }
            return ans;
        }
    };
    

标签:heights,wid,int,st,柱状图,ans,矩形,84,left
From: https://www.cnblogs.com/ouyangxx/p/18539651

相关文章

  • Excel.Application使用手册(摘自:https://www.cnblogs.com/codingking/p/6484461.html)
    定制模块行为(1)OptionExplicit'强制对模块内所有变量进行声明  OptionPrivateModule'标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  OptionCompareText'字符串不区分大小写  OptionBase1'指定数组的第一个下标为1(2)OnErrorResumeNe......
  • Springboot计算机毕业设计家乡印象网站984y9
    Springboot计算机毕业设计家乡印象网站984y9本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,笔记信息,标签分类,举报信息,主题活动,活动投稿,助农产品,产品分类,地区分类开题报告内容一、项目......
  • [数组排序] 0384. 打乱数组
    文章目录1.题目大意2.题目大意3.示例4.解题思路5.参考代码1.题目大意384.打乱数组-力扣(LeetCode)2.题目大意描述:给定一个整数数组nums。要求:设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是等可能的。实现Solutionclass:Sol......
  • django违法犯罪防范科普平台系统-计算机毕业设计源码84527
    摘 要本文介绍了一个基于Django的违法犯罪防范科普平台的设计与实现。随着社会的进步和科技的发展,违法犯罪活动呈现多样化和复杂化的趋势,对公众进行违法犯罪防范的科普教育变得尤为重要。该平台利用Django框架提供的高效且可扩展的特性,实现了用户注册与登录、科普文章发布与......
  • 全零子矩形计数问题
    经典问题,但是我为什么不会呢?????题意给定一张\(n\timesm\)的01矩阵,求出有多少个子矩阵使得子矩阵内没有1。\(n,m\le10^3\)分析考虑枚举每一行,计算以该行上每个点为右下角的合法子矩形个数\(\sumsum_{i,j}\),也就是说,计算左上角的个数使得左上角和该右下角形成的子矩形不......
  • [LeetCode] 2841. Maximum Sum of Almost Unique Subarray
    Youaregivenanintegerarraynumsandtwopositiveintegersmandk.Returnthemaximumsumoutofallalmostuniquesubarraysoflengthkofnums.Ifnosuchsubarrayexists,return0.Asubarrayofnumsisalmostuniqueifitcontainsatleastmdisti......
  • Living-Dream 系列笔记 第84期
    连通性问题点双连通:在无向图中,删除一个点(不是\(x\)或者\(y\))后,点\(x\)和点\(y\)仍然能够彼此到达,那么称\(x\)和\(y\)是点双连通的。边双连通:在无向图中,删除一条边后,点\(x\)和点\(y\)仍然能够彼此到达,那么称\(x\)和\(y\)是边双连通的。性质点双连......
  • 【黑马python:函数进阶】81-84
    目录一、函数的多个返回值二、函数的多种传参方式1.函数参数种类1.1位置参数与关键字参数1.2缺省参数1.3不定长参数三、函数作为参数传递四、匿名函数一、函数的多个返回值如果一个函数要有多个返回值,该如何书写代码?按照返回值的顺序,写对应顺序的多个变量接......
  • Leetcode 3235. 判断矩形的两个角落是否可达
    1classSolution{2public:3boolcanReachCorner(intxCorner,intyCorner,vector<vector<int>>&circles){4vector<bool>visited(circles.size(),false);56function<bool(int)>dfs=[&](inti)......
  • 力扣21 打卡16 判断矩形的两个角落是否可达
    思路:首先,检查矩形的起点和终点是否在任何一个圆的范围内,如果是则不存在合法路径。接着,判断每个圆是否与矩形的左上角边界或右下角边界相交。对于与左上边界相交的圆,使用深度优先搜索(DFS),查找是否存在一组相连的圆,最终能连接到右下边界。若找到这样的路径,则矩形被封锁,返回Fa......