代码随想录Day54

news2024/11/27 12:55:30

今天是国庆假期后的恢复做题的第一天,摆了那么久感觉还是有点没摆够哈哈哈哈!今天两道题都是困难题,两道题都去看讲解了,感觉这两道题是高度相似的,接雨水用单调递增栈来做,柱状图中最大的矩形用单调递减栈来做。

42. 接雨水

这道题还是延续之前的思路,用单调递增栈来做,即从栈顶到栈底为单调递增。雨水的体积就是这些柱子能够围成的凹槽的面积,遍历所有柱子,当遍历到的柱子高度小于等于栈顶的高度时,就将当前遍历到的柱子也压入栈中,这样符合单调递减栈的设计;当遍历到的柱子高度大于栈顶柱子的高度时,这就需要取出栈中的元素来计算结果了,先将栈顶元素用一个变量mid保存,再将栈顶元素弹出,该变量作为凹槽中的最底部,当前遍历的柱子作为凹槽中的右侧墙壁,弹出元素后新的栈顶元素作为凹槽中的左侧墙壁,如图所示。

当然这个计算过程是一个持续的过程,并不是计算一次就接着遍历下一根柱子了,考虑这么一种情况:输入数组为[8, 7, 6, 8],当遍历到最后一个8时触发计算条件,进入while循环,倘若没有while循环的话,计算一次结果后就会因为遍历完最后一根柱子而退出外层for循环,导致雨水量少算了。正确计算雨水的过程如图所示。

还有一个情况要考虑,就是在触发计算条件时,当把栈顶元素用mid保存后弹出时,需要立即判断栈是否为空,如果栈已经为空了,就说明下一步无法计算了,强行计算会报错,所以栈为空的话就直接将当前遍历到的柱子压入栈中即可。具体例子看下面这张图。

这种情况下是接不了雨水的,所以需要额外对栈是否为空进行判定。
这是代码

class Solution {
public:
    int trap(vector<int>& height) {
        int result = 0;
        stack<int> st;  //从栈顶到栈底是单调递增的
        st.push(0);
        for(int i = 1; i < height.size(); i++){
            if(height[i] <= height[st.top()])  //当前遍历元素小于等于栈顶元素,直接压入栈中
                st.push(i);
            else{  //当前遍历元素大于栈顶元素,开始计算雨水量
                while(!st.empty() && height[i] > height[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){ //栈不为空才进行下一步计算雨水操作,否则会越界访问报错
                        int w = i - st.top() - 1;
                        int h = min(height[i],  height[st.top()]) - height[mid];
                        result += w * h;
                    }                    
                }  
                st.push(i);
            }
        }
        return result;
    }
};

84.柱状图中最大的矩形

这道题的代码整体结构和上一题很像,这一题主要是用单调递减栈来做的,即栈顶到栈底单调递减,此外这里还有个小细节,就是这道题需要在原数组的首部和尾部插入0,具体后面会讲。
首先还是介绍一下触发计算条件时的一般计算过程,如下图所示。

计算矩形面积的时候,是以heights[mid]为高度,当前遍历到的柱子与新的栈顶中的柱子之间的间隔为宽的矩形来计算的。下面也再模拟一次持续计算的过程。考虑输入为[1, 2, 3, 2, 1],当遍历到第二个2时触发计算条件。如下图所示。

三个2拼接成面积为6的情况将在下一次外循环,即遍历到最后一个1时触发计算条件,这里不再赘述。
这里再解释下为什么要在数组的头部和尾部添0,这是因为输入的柱子都遍历完的情况下,还可能存在没有计算的情况,在上面那个例子中,当遍历到最后一个1时,触发计算条件,计算完下面的面积后,循环就终止了,但是高为1的情况被遗漏了。

尽管这种情况计算出来的面积不一定更大,但是这样的情况必须要考虑进去,所以需要在数组的首尾添0,用来触发这种情况的计算。其余的地方都和上一题没啥区别,无非是大于号与小于号互相颠倒。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        //先将输入的数组首尾都添0
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        stack<int> st;   //从栈顶到栈底单调递减
        st.push(0);
        int result = 0;
        for(int i= 1; i < heights.size(); i++){
            if(heights[i] >= heights[st.top()])  //遍历到的元素大于等于当前栈顶元素,压入栈中
                st.push(i);
            else{  //遍历到的元素小于当前栈顶元素,开始计算矩形面积
                while(!st.empty() && heights[i] < heights[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        int w = i - st.top() - 1;
                        int h = heights[mid];
                        result = max(w * h, result);
                    }
                    
                }
                st.push(i);
            }
        }
        return result;
    }
};

今天是单调栈最后一天了,也是代码随想录视频系列的最后一节了,之后的题目就没有视频讲解了,感觉有点害怕😰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

水凝胶发生器,不对称设计妙,医电应用前景广

大家好&#xff01;今天来了解一种具有工程机械离子不对称性的水凝胶发生器——《A high-current hydrogel generator with engineered mechanoionic asymmetry》发表于《Nature Communications》。嘿&#xff01;你能想象一种材料&#xff0c;它能像魔法一样在低频运动下产生高…

消息称苹果iPhone系列将完全放弃LCD屏幕

近日&#xff0c;据日经亚洲消息&#xff0c;苹果公司将于明年初推出搭载OLED显示屏的 iPhone SE 4&#xff0c;标志其整个iPhone系列已进入从 LCD 过渡到 OLED 技术的最后阶段&#xff0c;2025年及之后销售的所有iPhone机型均将搭载OLED屏幕。 由此&#xff0c;两家日本面板供…

【一起学NLP】Chapter3-使用神经网络解决问题

目录 使用神经网络解决问题Tip:数据集划分学习使用的代码Tip:epochTip:数据打乱Trainer类Tip-高速化计算 使用神经网络解决问题 import sys sys.path.append(..) # 为了引入父目录的文件而进行的设定 from dataset import spiral import matplotlib.pyplot as pltx,t spiral.…

解决银河麒麟桌面操作系统V10(ARM)中`apt-get update`“正在等待报头”问题

解决银河麒麟桌面操作系统V10&#xff08;ARM&#xff09;中apt-get update“正在等待报头”问题 1、问题描述2、 解决方法步骤一&#xff1a;打开终端步骤二&#xff1a;清理APT缓存步骤三&#xff1a;再次尝试更新软件源 &#x1f496;The Begin&#x1f496;点点关注&#x…

利士策分享,故事创作和造谣及假新闻之间如何界定?

利士策分享&#xff0c;故事创作和造谣及假新闻之间如何界定&#xff1f; 在这个信息爆炸的时代&#xff0c;一篇打着“人民网”旗号的虚假文章《低俗炒作博眼球&#xff0c;曝"瓜"文化不可取》在网络上迅速发酵&#xff0c;不仅误导了公众&#xff0c;更对无辜者造…

【源码+文档】基于SpringBoot+Vue校园智慧迎新服务平台

&#x1f6a9;如何选题&#xff1f; 如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;这些问题是需要大家在选题前需要考虑的&#xff0c;具体的方法我会在文末详细为你解答。 &#x1f6ad;如何快速熟悉一个项目…

MySQL【知识改变命运】03

表的基本操作 1&#xff1a;查看所有表2&#xff1a;创建表3&#xff1a;查看表结构4&#xff1a;修改表5&#xff1a; 删除表 前言&#xff1a;我们先了解一个知识&#xff1a; MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…

《Windows PE》4.1导入表

导入表顾名思义&#xff0c;就是记录外部导入函数信息的表。这些信息包括外部导入函数的序号、名称、地址和所属的DLL动态链接库的名称。Windows程序中使用的所有API接口函数都是从系统DLL中调用的。当然也可能是自定义的DLL动态链接库。对于调用方&#xff0c;我们称之为导入函…

本田汽车投资SiLC Technologies:携手共促自动驾驶技术新飞跃

SiLC Technologies获本田汽车投资:加速自动驾驶技术革新 近日,硅谷光子学初创公司SiLC Technologies宣布获得本田汽车的投资,这一合作标志着双方将共同推进自动驾驶技术领域的革新与发展。本田此次投资不仅体现了对SiLC Technologies技术实力的认可,也彰显了本田在自动驾驶…

进程管理和进程调度的基本过程(详细版)

“无论你走得多慢&#xff0c;总比停下来要好。” 对于操作系统内核来说&#xff0c;里面包含的功能是非常多的&#xff0c;其中有一个功能和日常开发&#xff0c;息息相关。 进程管理&#xff1a; 进程&#xff08;process/task&#xff09;&#xff1a;进程就是正在执行的应…

一个月学会Java 第4天 运算符和数据转换

Day4 运算符和数据转换 今天来讲运算符&#xff0c;每个运算符的作用和现象&#xff0c;首先我们先复习一下数据类型&#xff0c; day2讲过基本数据类型有八种&#xff0c;int、short、long、byte、char、boolean、float、double&#xff0c;分别为四个整型、一个字符型、一个布…

代码随想录 | Day28 | 回溯算法:组合组合总和III

代码随想录 | Day28 | 回溯算法&#xff1a;组合&&组合总和III 关于这个章节&#xff0c;大家最好是对递归函数的理解要比较到位&#xff0c;听着b站视频课可能呢才舒服点&#xff0c;可以先去搜一搜关于递归函数的讲解&#xff0c;理解&#xff0c;再开始这个章节会比…

01 从0开始搭建django环境

1 安装相关版本的django&#xff0c;这里&#xff0c;我以5.1.1为例子 pip3 install django5.1.1 (.venv) D:\DjangoCode\MS>pip3 install django5.1.1 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting django5.1.1Using cached https://pypi.t…

算法题总结(七)——栈与队列

1、栈常用操作 &#xff08;1&#xff09;栈定义 Stack<Integer> stack new Stack<Integer>();&#xff08;2&#xff09;栈操作 .栈是否为空 isEmpty(); .查询栈顶元素&#xff0c;不改变栈 peek(); .弹出栈顶元素&#xff0c;改变栈 pop(); .压入栈顶 push(); …

Quantify LLM

大模型如果用bfloat16需要特别大的显存&#xff0c;所以都在用INT4、INT8做量化&#xff0c;效果不错 量化学习 为什么量化 对Llama13B模型来说&#xff0c;不同算子加载需要的显存不同 中间是TensorCore&#xff0c;左右两边是显存&#xff0c;加载过程中模型要频繁地将wei…

【移动端】事件基础

一、移动端事件分类 移动端事件主要分为以下几类&#xff1a; 1. 触摸事件&#xff08;Touch Events&#xff09; 触摸事件是移动设备特有的事件&#xff0c;用来处理用户通过触摸屏幕进行的操作。主要的触摸事件有&#xff1a; touchstart&#xff1a;手指触摸屏幕时触发。…

k8s 之动态创建pv失败(踩坑)

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/02/05 18:53 初学容易范的错&#xff01; 问题简述&#xff1a; StorageClass创建成功&#xff0c;StatefulSet 启动不成功&#xff0c;与pvc关联的po和pvc一直是pending状态。 也就是说&#xff0c;StorageClass没有动态…

MQTT--Java整合EMQX

目录 1、简介2、准备3、使用步骤3.1 引入依赖3.2 创建生产者和消费者3.3 测试 总结PS: 1、简介 本文章实现了一个简单的MQTT客户端&#xff0c;使用Eclipse Paho库让Java和EMQX整合&#xff0c;测试客户端初始化时配置Broker地址、客户端ID、用户名和密码。连接成功后&#xf…

python sqlite3 工具函数

起因&#xff0c; 目的: sqlite3 最常用的函数。 比如&#xff0c;某人给了一个 database.db 文件。 但是你登录的时候&#xff0c;不知道账号密码。 此文件就是&#xff0c;查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码&#xff0c; 见注释 impor…

字节跳动收购Oladance耳机:强化音频技术,加速VR/AR生态布局

字节跳动收购Oladance耳机&#xff1a;加码VR/AR领域布局 近日&#xff0c;字节跳动宣布已完成对开放式耳机品牌Oladance的收购&#xff0c;实现了对该品牌的100%控股。这一收购标志着字节跳动在AI硬件领域的进一步扩展和深化&#xff0c;特别是对其VR/AR领域布局的重要加码。 …