代码随想录算法训练营day59|第十章 单调栈part02

2024-03-14 04:36

本文主要是介绍代码随想录算法训练营day59|第十章 单调栈part02,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

503.下一个更大元素II 

42. 接雨水  


 

503.下一个更大元素II 

这道题和 739. 每日温度 几乎如出一辙,可以自己尝试做一做

 

代码随想录

这道题可以直接拼接数组,但是显然使用取余运算更划算。注意这回 i 代表的不直接是nums的下标,而更多的是遍历次数,取余之后才会是nums下标。还有文章里面给出的for的循环次数是nums.size()*2-1,而实际上可以是nums.size()*2-2,因为之所以要遍历两遍nums,是为了让所有的元素找临近较大值的时候可以从它的左边转一圈找到它的右边,所以针对最后后一个元素的寻找(其他元素早就满足这种寻找了),可以不遍历最后一个元素本身。

vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;vector<int> res(nums.size(),-1);st.push(0);for(int i=1;i<nums.size()*2-1;i++){while(st.size()&&nums[i%nums.size()]>nums[st.top()]){res[st.top()]=nums[i%nums.size()];st.pop();}st.push(i%nums.size());}return res;}

42. 接雨水  

接雨水这道题目是 面试中特别高频的一道题,也是单调栈 应用的题目,大家好好做做。建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些。在时间紧张的情况有,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何优化。 

代码随想录

这道题使用双指针的思路其实是遍历两遍height数组,分别找到它的右边最高的柱子和左边最高的柱子,然后取这两个的最小值,这个值就是填满水之后应该达到的高度,如果这个高度是正值那就加上,反之说明不合法则不予理会,以此来求当前下标处增加的水量。

遍历求右边最高柱子的时候要从右往左遍历,如果当前的柱子高度小于历史最高柱子的高度,那就把历史最高柱子高度赋值给它,反之如果大于,那就证明当前柱子的右边没有比它更高的柱子了,于是这个下标处也不会盛水,所以为了依旧套用递推公式,这个地方应该赋值为当前柱子的高度(在使用递推公式推导的时候,需要求最小值,这个最小值有可能是当前柱子的高度,那么计算出来值就会是0,而如果是最左边柱子的高度,那么这个值就会是负数,而因为不合法,所以不被加入)。于是推导公式就简化为取当前柱子高度和历史柱子最高高度的最大值。求左边最高柱子数组差不多一个道理,只是需要倒序遍历。注意,可以事先设置这个最大高度为0,然后遍历就可以从两端开始,或者也可以直接把两端的值设置为两端柱子的高度,这样可以少遍历一个值,其实大差不差。

b5f475ca069b4318ac336879f69547c6.png

int trap(vector<int>& height) {if (height.size() <= 2) return 0;vector<int> maxLeft(height.size(), 0);vector<int> maxRight(height.size(), 0);int size = maxRight.size();// 记录每个柱子左边柱子最大高度maxLeft[0] = height[0];for (int i = 1; i < size; i++) {maxLeft[i] = max(height[i], maxLeft[i - 1]);}// 记录每个柱子右边柱子最大高度maxRight[size - 1] = height[size - 1];for (int i = size - 2; i >= 0; i--) {maxRight[i] = max(height[i], maxRight[i + 1]);}// 求和int sum = 0;for (int i = 0; i < size; i++) {int count = min(maxLeft[i], maxRight[i]) - height[i];if (count > 0) sum += count;}return sum;}

这道题使用单调栈做法也比较复杂,因为单调栈每次会弹出一些元素,所以不能像双指针做法那样按列来求,而是要一行一行的求,也就是除了求增加水量的高度之外,还要求增加水量的宽度(上一题直接求高度代表水量是因为宽度默认为1了)。

每次如果遍历到大于栈顶元素的值,那就先记录一下当前的栈顶元素,然后再弹出这个栈顶元素,然后再判断一下这个栈里面是否还剩有元素,如果剩有元素,证明可能构成一个凹槽用来盛水,那就要计算盛水的水量,先计算水的高度,水的高度取遍历的柱子的高度和栈顶高度的最小值再减去之前储存的那个栈顶元素,水的宽度当然就是遍历的元素的下标和现在栈顶元素的下标的下标差再减一(因为求的是中间的部分,用来盛水的那种宽度),相乘求得水量;而如果没有元素剩余,那就证明不能盛水。无论能否盛水,都需要将当前元素压入栈,以便后来的判断。如果遍历到小于等于栈顶元素的值,那就直接压入栈。

其实便利到等于栈顶元素的值有两种处理方法,第一种方法是直接压入栈中,然后按上面的做法来处理;另一种做法是舍弃掉这个元素,其实就算不舍弃压入栈中,最后公式计算得到的增加水量也是零,所以没什么太大差别。

afe86d9a5d7e46df9c4a658a30758479.png

int trap(vector<int>& height) {stack<int> st;st.push(0);int sum = 0;for (int i = 1; i < height.size(); i++) {while (!st.empty() && height[i] > height[st.top()]) {int mid = st.top();st.pop();if (!st.empty()) {int h = min(height[st.top()], height[i]) - height[mid];int w = i - st.top() - 1;sum += h * w;}}st.push(i);}return sum;}

 

 

这篇关于代码随想录算法训练营day59|第十章 单调栈part02的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807205

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示