代码随想录算法训练营第五十九天| 单调栈 503 下一个更大元素II 42 接雨水

news/2024/4/18 17:29:53/文章来源:https://blog.csdn.net/qq_42218240/article/details/130157947

代码随想录算法训练营第五十九天| 单调栈 503 下一个更大元素II 42 接雨水

LeetCode 503 下一个更大元素II

题目: 503.下一个更大元素II

思路:本题重点在于如何处理循环数组,首先想到将两个数组拼在一起,然后使用单调栈求下一个最大值

方法一:

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {//拼接新的numsvector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.begin(), nums1.end());//用新的nums大小来初始化resultvector<int> result(nums.size(), -1);if(nums.size() == 0) return result;//开始单调栈stack<int> st;st.push(0);for(int i = 1; i < nums.size(); i++) {if(nums[i] < nums[st.top()]) st.push(i);else if (nums[i] == nums[st.top()]) st.push(i);else {while(!st.empty() && nums[i] > nums[st.top()]) {result[st.top()] = nums[i];st.pop();}st.push(i);}}//最后把result数组resize到原数组大小result.resize(nums.size() / 2);return result;}
};

注:此方法比较直观,但是做了无用操作,修改了nums数组,最后还需result数组resize,resize时间复杂度为O(1),但是扩充nums数组多了一个O(n)的操作。

方法二:也可以不用扩充nums,在遍历过程中模拟走两遍nums

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if(nums.size() == 0) return result;stack<int> st;st.push(0);for(int i = 1; i < nums.size() * 2; i++) {//模拟遍历两遍nums,注意都是用i % nums.size()来操作if(nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());else if(nums[i % nums.size()]  == nums[st.top()]) st.push(i % nums.size());else {while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}}return result;}
};

LeetCode 42 接雨水

题目: 42.接雨水

接雨水问题在面试中非常常见,通常有三种解法:

  • 双指针法
  • 动态规划
  • 单调栈

双指针法,也是暴力解法:需要明确是按照行来计算还是按照列来计算,这里考虑按照列来计算,宽度一定为1,求出每一列雨水的高度即可。

每列雨水的高度取决于左侧最高的柱子和右侧最高的柱子中最矮的柱子高度,从头遍历所有列,相加则可得到总雨水的体积,注意第一个柱子和最后一个柱子不接雨水

for(int i = 0; i < height.size(); i++) {//第一个柱子和最后一个柱子不接雨水if(i == 0 || i == height.size() - 1) continue;
}

在for循环中求左右两边最高柱子,代码为:

int rHeight = height[i];  //记录右边柱子的最高高度
int lHeight = height[i];  //记录左边柱子的最高高度
for(int r = i; r < height.size(); r++) {if(height[r] > rHeight) rHeight = height[r];
}
for(int l = i - 1; l >= 0; l--) {if(height[l] > lHeight) lHeight = height[l];
}

最后计算该列雨水高度

int h = min(lHeight, rHeight) - height[i];
if(h > 0) sum += h;  //注意只有h大于零的时候,再统计到总和中

完整代码:

class Solution {
public:
int trap(vector<int>& height) {int sum = 0;for(int i = 0; i < height.size() - 1; i++) {//第一个柱子和最后一个柱子不接雨水if(i == 0 || i == height.size() - 1) continue;int rHeight = height[i];int lHeight = height[i];for(int r = i + 1; r < height.size(); r++) {if(height[r] > rHeight) rHeight = height[r];}for(int l = i - 1; l >= 0; l--) {if(height[l] > lHeight) lHeight = height[r];}int h = min(lHeight, rHeight) - height[i];if(h > 0) sum += h;}return sum;
}
};

双指针优化:为了得到两边最高高度,使用双指针遍历,每到一个柱子都向两边遍历一遍,有重复计算。把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),从而避免重复计算。

当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。

从左向右遍历:maxLeft[i] = max(height[i], maxLeft[i - 1]);

从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]);

class Solution {
public: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;}
};

单调栈解法:

接雨水需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积。

  • 首先单调栈按照行方向来计算雨水

  • 使用单调栈内元素的顺序

从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。

一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

  • 如果遇到相同高度的柱子

遇到相同的元素,更新栈内下标,将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。。

如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度

  • 栈里保存数值

使用单调栈,通过长 * 宽计算雨水面积。长是通过柱子的高度来计算,宽是通过柱子之间的下标来计算,

栈里有没有必要存一个pair<int, int>类型的元素,保存柱子的高度和下标呢。不需要,栈里就存放下标就行,想要知道对应的高度,通过height[stack.top()] 就知道弹出的下标对应的高度了。

完整代码:

class Solution {
public:int trap(vector<int>& height) {if (height.size() <= 2) return 0; // 可以不加stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度st.push(0);int sum = 0;for (int i = 1; i < height.size(); i++) {if (height[i] < height[st.top()]) {     // 情况一st.push(i);} if (height[i] == height[st.top()]) {  // 情况二st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。st.push(i);} else {                                // 情况三while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是whileint 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;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物业企业如何加快向现代服务业转型

近年来&#xff0c;随着人民生活水平的提高&#xff0c;人们对住宅质量提出更高的要求&#xff0c;在此前提下&#xff0c;全国各地涌现出了一些运用现代的计算机、控制与通信技术建设的智能化住宅小区。但是许多智能化住宅小区都存在建好了智能硬件环境却没有智能化的软件在上…

JVM之低延迟垃圾收集器

目录 低延迟垃圾收集器 概要 各款收集器的并发情况 Shenandoah收集器 Shenandoah相比G1的改进之处 链接矩阵 定义 优点 Shenandoah收集器的工作过程 Brooks Pointer 转发指针技术 转发指针的优缺点 Shenandoah 性能测试 Shenandoah 总结 ZGC 收集器 ZGC的Region的…

ActiveMQ使用(一):在JavaScript中使用stomp.js

ActiveMQ使用(一):在JavaScript中使用stomp.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesstomp.js 2.3.3: 下载地址:https://www.jsdelivr.com/package/npm/stompjs 2. 相关代码 <!DOCTYPE html> <html l…

ABAP 创建、修改、删除内部交货单(VL31N/VL32N)

一、干货 VL31N创建的BAPI&#xff1a; 1.GN_DELIVERY_CREATE 通用交货单使用的bapi&#xff0c;推荐使用 2.BAPI_DELIVERYPROCESSING_EXEC 简单&#xff0c;但是字段比较少 3.BBP_INB_DELIVERY_CREATE 听说有bug&#xff0c;我就没有使用这个了 VL32N修改/删除BAPI: BAPI_INB…

从此告别PPT制作的烦恼:ChatGPT和MindShow帮你快速完成

目录前言一、chatGPT&MindShow简介二、chatGPT&MindShow搭配生成PPT2-1、注意事项2-2、生成PPT的步骤2-3、使用chatGPT进行探索2-4、内容生成2-5、PPT制作三、碎碎念总结前言 随着科技的不断发展&#xff0c;人们对于AI技术的依赖和需求也在逐渐增加。然而&#xff0c…

使用layui组件库制作进度条

使用layui组件库制作进度条 html代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Example</title><!-- 引入 layui 的 CSS 文件 --><link rel"stylesheet" href"https://cdn.staticfil…

(数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换

文章目录一&#xff1a;Radon变换&#xff08;1&#xff09;Radon变换原理&#xff08;2&#xff09;Radon变换实现&#xff08;3&#xff09;Radon变换性质&#xff08;4&#xff09;Radon变换应用二&#xff1a;小波变换&#xff08;1&#xff09;小波A&#xff1a;定义B&…

盐城北大青鸟告诉你互联网大厂的哪些岗位不限专业?

进大厂是毕业生、职场人梦寐以求的工作&#xff01; 除了高薪以外&#xff0c;大厂具有舒适的工作环境&#xff0c;一流高校的同事&#xff0c;高额的住房补贴&#xff0c;健身房&#xff0c;下午茶&#xff0c;重点是还有营养丰富的员工餐&#xff01; 那互联网公司都有什么…

Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

状态管理是自适应平台服务中的一个功能集群。 在自适应平台中&#xff0c;状态决定了一组活动的自适应应用程序。 特定于项目的应用程序&#xff0c;即状态管理器&#xff0c;决定何时请求状态更改&#xff0c;从而更改当前活动的应用程序集。状态管理器是特定于项目的&#…

基于NXP iMX8M Mini处理器测试DPDK

By Toradex秦海 1). 简介 DPDK (Data Plane Development Kit) 软件是一组用户空间库和驱动程序&#xff0c;可加速在所有主要 CPU 架构上运行的网络数据包处理工作负载&#xff0c;以便提升整个网络数据服务的QoS。其最早由 Intel 大约 2010年创建&#xff0c;后由6WIND公司发…

【CSS】元素显示与隐藏 ( display 隐藏对象 | visibility 隐藏对象 | overflow 隐藏对象 )

文章目录一、元素的显示与隐藏二、display 隐藏对象1、display 隐藏对象语法说明2、display 显示元素代码示例3、display 隐藏元素代码示例三、visibility 隐藏对象1、visibility 隐藏对象语法说明2、visibility 显示对象代码示例3、visibility 隐藏对象代码示例四、overflow 隐…

96年阿里P7晒出工资单:狠补了这个,真香...

最近一哥们跟我聊天装逼&#xff0c;说他最近从阿里跳槽了&#xff0c;我问他跳出来拿了多少&#xff1f;哥们表示很得意&#xff0c;说跳槽到新公司一个月后发了工资&#xff0c;月入5万多&#xff0c;表示很满足&#xff01;这样的高薪资着实让人羡慕&#xff0c;我猜这是税后…

MongoDB 聚合管道的集合关联($lookup)及合并($unionWith)

目前为止&#xff0c;我们已经介绍了一部分聚合管道中的管道参数&#xff1a; $match&#xff1a;文档过滤 $group&#xff1a;文档分组&#xff0c;并介绍了分组中的常用操作&#xff1a;$addToSet&#xff0c;$avg&#xff0c;$sum&#xff0c;$min&#xff0c;$max等。 $add…

可用的rtsp ,rtmp地址以及使用VLC和ffmpeg 播放视频流

可用的 rtmp地址: rtmp://ns8.indexforce.com/home/mystream 可用的 rtsp地址: rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 可搭配VLC播放器使用&#xff0c;以及虚幻4 流媒体使用&#xff0c;实现直播效果 1.使用VLC 播放&#xff1a;https://www.vi…

某某客户的一次勒索病毒应急响应

Lockbit勒索病毒应急响应背景1、应急处理排查2、勒索病毒来源分析3、勒索病毒分析4、勒索病毒解密5、主机分析分析6、后续安全加固和改进措施结论背景 美好的周六刚开始&#xff0c;眼睛一睁&#xff0c;领导就发消息&#xff0c;说某客户中了勒索病毒&#xff0c;特别着急&am…

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版 会议简介 Brief Introduction 2023年第三届智能机器人与系统国际会议(ISoIRS 2023) 会议时间&#xff1a;2023年5月26日-28日 召开地点&#xff1a;中国长沙 大会官网&#xff1a;www.isoirs.org ISoIRS…

项目打包记录提交id

某天上午正在摸鱼的小邓&#xff0c;突然被领导拉倒一个2年前项目的现场问题沟通群&#xff0c;说是现场数据无法入库&#xff0c;需要排查&#xff0c;奈何不知道版本&#xff0c;无奈的小邓值得用时间记录一个点一个点的从gitlab中查找&#xff0c;为了防止后续提供到现场的版…

基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发(一)总体设计

2.1 功能要求及性能指标 2.1.1 功能要求 &#xff08;1&#xff09;具备方位和俯仰两轴运动的能力&#xff1b; &#xff08;2&#xff09;方位轴可实现预置、周扫和扇扫功能&#xff1b; &#xff08;3&#xff09;俯仰轴可实现预置功能。 2.1.2 性能指标 &#xff08;1&#…

江南爱窗帘十大品牌,怎么合理的搭配窗帘配色

窗帘行业圈&#xff1a;窗帘行业内部交流圈&#xff0c;窗帘从业者的交流内部圈。 当阳光照进房间的那一刻&#xff0c; 光线给空间带来了无限的可能。 窗边的帘帐既是美丽的风景 又是可爱的魔术师。 在光影变幻的时空里 让你的生活布满温馨和奇幻。 1.窗帘材质怎么选 窗帘的材…

Voting_Averaging算法预测银行客户流失率

Voting_Averaging算法预测银行客户流失率 描述 为了防止银行的客户流失&#xff0c;通过数据分析&#xff0c;识别并可视化哪些因素导致了客户流失&#xff0c;并通过建立一个预测模型&#xff0c;识别客户是否会流失&#xff0c;流失的概率有多大。以便银行的客户服务部门更…