Day52 | 动态规划 :单调栈 每日温度下一个更大的元素I下一个更大元素II

Day52 | 动态规划 :单调栈 每日温度&&下一个更大的元素I&&下一个更大元素II

单调栈【基础算法精讲 26】_哔哩哔哩_bilibili

及时去掉无用数据,保证栈中元素有序

文章目录

  • Day52 | 动态规划 :单调栈 每日温度&&下一个更大的元素I&&下一个更大元素II
    • 739.每日温度
    • 496.下一个更大元素I
    • 503.下一个更大的元素II

739.每日温度

739. 每日温度 - 力扣(LeetCode)

从左往右遍历

每次碰到一个数就先和栈顶元素进行比较,如果比栈顶元素大,那说明我们找到了答案,就记录答案,然后把找到答案的元素出栈

我们这样收集下来,栈里面的元素都是单调递减的

image-20241202175614447

举个例子,如图所示

我们从1往后遍历,栈为空,1入栈,此时栈内为1

碰到4,4大于1,那就把1出栈,然后记录答案,4入栈,栈内为4

碰到3,3小于4, 3入栈,栈内为4,3

碰到5, 5大于3,3出栈,记录答案,栈内为4

栈顶元素变成了4,继续比较,5大于4,4也找到了答案,记录答案,4弹出,5入栈

以此类推

完整代码:

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> res(temperatures.size(),0);stack<int> st;for(int i=0;i<temperatures.size();i++){while(!st.empty()&&temperatures[i]>temperatures[st.top()]){res[st.top()]=i-st.top();st.pop();}st.push(i);}return res;}
};

496.下一个更大元素I

496. 下一个更大元素 I - 力扣(LeetCode)

和上一题思路基本一模一样的,就说一下怎么由第一道题变到第二道题

题意:

第二题的意思是第一个数组里面的数字对应到第二个数组里面的相应位置,在第二个数组里面找它的下一个更大数字

举例:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]

第一个数组里面的1,对应第二个数组里面的第一个元素,第一个元素的下一个更大数字就是3,我们返回的就是3

栈还是单调递减的栈,单调栈遍历的是数组2,我们在哪里找下一个更大数字,就遍历哪个数组

第一题第二题区别:

首先要知道nums1是nums2的子集,如果nums1有,但是nums2没有,那说明肯定就是-1,不用管的

那既然知道nums1有的nums2肯定有,那我们就直接在第二个数组里面找下一个更大数,每一个元素都找。

在更新答案的时候,如果当前元素是nums1里面的,那我们才会记录到res,否则的话就直接弹出就行

完整代码:

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> res(nums1.size(), -1);unordered_map<int, int> m; for (int i = 0; i < nums1.size(); i++) m[nums1[i]] = i;for (int i = 0; i < nums2.size(); i++) {while (!st.empty() && nums2[i] > nums2[st.top()]) {if (m.find(nums2[st.top()])!=m.end()){ int index = m[nums2[st.top()]]; res[index] = nums2[i];}st.pop();}st.push(i);}return res;}
};

灵神解法:

单调栈存的是元素而不是下标了。

笔者这里其实不是很理解,似懂非懂,大家看看代码随想录的就挺好。

感觉是单调栈又不是单调栈,单调栈遍历的感觉像是数组1,但是也能得到正确的答案。

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> res(nums1.size(),-1);unordered_map<int,int> m;stack<int> st;for(int i=0;i<nums1.size();i++)m[nums1[i]]=i;for(int i=0;i<nums2.size();i++){while(!st.empty()&&nums2[i]>st.top()){res[m[st.top()]]=nums2[i];st.pop();}if(m.find(nums2[i])!=m.end())st.push(nums2[i]);}return res;}
};

503.下一个更大的元素II

503. 下一个更大元素 II - 力扣(LeetCode)

思路:

每日温度基础上,加个取余就行,碰到循环数组类似的题很好用

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

例如这个输入

我们就把他当做两个相同的数组拼起来的就行,实际上我们物理上直接把两个一样的数组拼到一起形成一个新数组和加取余符号效果相同

输入: nums = [1,2,3,4,3,   1,2,3,4,3]

完整代码:

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

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

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

相关文章

第30天:安全开发-JS 应用NodeJS 指南原型链污染Express 框架功能实现审计0

时间轴&#xff1a; 演示案例&#xff1a; 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF 题目&源码审计 开发指南-NodeJS-安全 SecGuide 项目、 环境搭建-NodeJ…

Java与AWS S3的文件操作

从零开始&#xff1a;Java与AWS S3的文件操作 一、什么是 AWS S3&#xff1f;AWS S3 的特点AWS S3 的应用场景 二、Java整合S3方法使用 MinIO 客户端操作 S3使用 AWS SDK 操作 S3 &#xff08;推荐使用&#xff09; 三、总结 一、什么是 AWS S3&#xff1f; Amazon Simple Sto…

Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)

CodeMonkey教程&#xff1a; https://www.youtube.com/watch?vQDWlGOocKm8 Siki学院汉化教程&#xff1a;如何使用Unity开发分手厨房&#xff08;胡闹厨房&#xff09;-Unity2023 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 版本&am…

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 在使用 ROS&#xff08;Robot Operating System&#xff09;进行开发时&#xff0c;通常会涉及多个 Catkin 工作空间&#xff08;Catkin Workspace&#xff09;。这些工作空间包含不同的 ROS 包和节点&#xff0c;可能相互…

第三方Cookie的消亡与Google服务器端标记的崛起

随着互联网用户对隐私保护的关注日益增强&#xff0c;各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而&#xff0c;Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie&#xff1f; …

SQL注入利用方式(实战Hack World 1)

一、布尔盲注利用 假如注入的网页能返回1或0的提示信息&#xff0c;我们可以写如下代码: select password from admin where username 1 or 11;#11是我们利用的逻辑点&#xff0c;我们能在此处进行一个判断&#xff0c;比如判断某个数据字段第几位上的字符是否为’ 1’&#…

nlp培训重点

SGD梯度下降公式&#xff1a; 当梯度大于0时&#xff0c;变小&#xff0c;往左边找梯度接近0的值。 当梯度小于0时&#xff0c;减去一个负数会变大&#xff0c;往右边找梯度接近0的值&#xff0c;此时梯度从负数到0上升 #coding:utf8import torch import torch.nn as nn impo…

Qt5语法的connect指定多个重载信号槽函数中的具体某一个

Qt5新语法的connect函数&#xff0c;使用起来更加简洁明了&#xff0c;但如果信号槽有同名的多个重载函数&#xff0c;只用类名和函数名就无法绑定&#xff0c;这时&#xff0c;可以使用qOverload来指定参数类型&#xff0c;例如&#xff1a; connect(ui->comboBox, qOverlo…

如何在Spark中使用gbdt模型分布式预测

这目录 1 训练gbdt模型2 第三方包python环境打包3 Spark中使用gbdt模型3.1 spark配置文件3.2 主函数main.py 4 spark任务提交 1 训练gbdt模型 我们可以基于lightgbm快速的训练一个gbdt模型&#xff0c;训练相对比较简单&#xff0c;只要把训练样本处理好&#xff0c;几行代码可…

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

HTML5系列(7)-- Web Storage 实战指南

前端技术探索系列&#xff1a;HTML5 Web Storage 实战指南 &#x1f5c4;️ 致读者&#xff1a;本地存储的新纪元 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 中的 Web Storage 技术&#xff0c;这是一个强大的本地存储解决方案&#xff0c;让我们能…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接&#xff08;Cross&#xff09;、内连接&#xff08;Inner&#xff09;、自然连接&#xff08;Natural&#xff09;、外连接&#xff08;Outer&#xff09; 2. ORDER BY to produce ordered output 3. 聚合函数&#xff08;Aggregate Functio…

算法训练营day23(二叉树09:修建二叉搜索树,有序数组转化为平衡二叉搜索树,二叉搜索树转化为累加树,二叉树专题总结)

第六章 二叉树part09今日内容&#xff1a;● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇 详细布置 669. 修剪二叉搜索树 这道题目比较难&#xff0c;比 添加增加和删除节点难的多&#xff0c;建议先看视频理解。题目…

C语言操作符深度解析

目录 一、操作符的分类 1、算术操作符 1、1、 和- 1、2、* 1、3、/ 1、4、% 2、赋值操作符&#xff1a;和复合赋值 2、1、连续赋值 2、2、复合赋值符 3、单⽬操作符&#xff1a;、--、、- 3、1、和-- 3、1、1、前置 3、1、2、后置 3、2、1、前置-- 3、2、2、后…

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…

《C++与人工智能:照亮能源可持续发展之路》

在全球对能源需求持续攀升以及对可持续发展日益重视的当下&#xff0c;如何有效解决能源领域的复杂问题成为了亟待攻克的关键挑战。而 C与人工智能技术的融合&#xff0c;正犹如一盏明灯&#xff0c;为能源管理、可再生能源预测等方面开辟出全新的路径&#xff0c;有力地推动着…

Python 深度学习框架之Keras库详解

文章目录 Python 深度学习框架之Keras库详解一、引言二、Keras的特点和优势1、用户友好2、多网络支持3、跨平台运行 三、Keras的安装和环境配置1、软硬件环境2、Python虚拟环境 四、使用示例1、MNIST手写数字识别 五、总结 Python 深度学习框架之Keras库详解 一、引言 Keras是…

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑 目录 文章目录 【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;相关工作后续优化方向 后记 检索增强…

android user版本默认usb模式为充电模式

android插入usb时会切换至默认设置的模式&#xff0c;debug版本为adb&#xff0c;user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…