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…

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…

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…

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、卷…

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、后…

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;相关工作后续优化方向 后记 检索增强…

_C#_串口助手_字符串拼接缺失问题(未知原理)

最近使用WPF开发串口助手时&#xff0c;遇到一个很奇怪的问题&#xff0c;无论是主线程、异步还是多线程&#xff0c;当串口接收速度达到0.016s一次以上&#xff0c;就会发生字符串缺失问题并且很卡。而0.016s就一切如常&#xff0c;仿佛0.015s与0.016s是天堑之隔。 同一份代码…

基于Python的猎聘网招聘数据采集与可视化分析

1.1项目简介 在现代社会&#xff0c;招聘市场的竞争日趋激烈&#xff0c;企业和求职者都希望能够更有效地找到合适的机会与人才。猎聘网作为国内领先的人力资源服务平台&#xff0c;汇聚了大量的招聘信息和求职者数据&#xff0c;为研究招聘市场趋势提供了丰富的素材。基于Pyt…

基于Java Springboot高校社团微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…

【前端】特殊案例分析深入理解 JavaScript 中的词法作用域

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;案例代码&#x1f4af;词法作用域&#xff08;Lexical Scope&#xff09;与静态作用域什么是词法作用域&#xff1f;代码执行的详细分析 &#x1f4af;函数定义与调用的…

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候&#xff0c;大家会用到python &#xff0c;因为实现起来很方便。但是其实Node.js 用来爬取网络内容&#xff0c;也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫&#xff0c;可…

三分钟快速掌握——Linux【vim】的使用及操作方法

一、vim的使用 vim是一个文本编辑器 非常小巧轻便 1.1如何进入vim编辑器 方法一&#xff1a; 首先使用touch 1.c 创建一个源文件 然后使用vim 1.c进入 方法二&#xff1a; 直接使用指令 vim 2.c 会直接创建一个2.c的源文件 退出时记得保存&#xff08;使用wq或者x&am…

(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型

摘要&#xff1a; 本文将指导您如何部署一个本地AI大语言模型聊天系统&#xff0c;使用Chatbox AI客户端应用和grok-beta大模型&#xff0c;以实现高效、智能的聊天体验。 引言&#xff1a; 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…

docker安装hadoop环境

一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件&#xff0c;用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…