代码随想录Day62 | 739.每日温度 496.下一个更大元素 I

Lmbench测试集 --- 延迟测试工具lat_mem_rd lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析 阅读详情

代码随想录Day62 | 739.每日温度 496.下一个更大元素 I

单调栈

用于解决一个一维数组中,要寻找任意一个元素的右边或者左边第一个比自己大或者小的元素的位置,就可以考虑单调栈。
本质是在遍历数组中,需要用一个栈来记录右边(或者左边)第一个比当前元素大(或者小)的元素位置。
单调栈需要明确的几个要点

  1. 单调栈里存放的元素是什么
  2. 单调栈里的元素是递增还是递减
    顺序的描述应该是以从栈头到栈底的顺序
    如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的
  3. 单调栈的主要判断条件
    当前元素小于栈顶元素
    当前元素等于栈顶元素
    当前元素大于栈顶元素

739.每日温度

文档讲解:代码随想录
视频讲解: 单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度
状态

首先考虑暴力解法最后超时了,利用双重循环,当第二层循环中遇到比外层循环i所对应的温度高时记录,然后跳出更新返回结果。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> res(temperatures.size(),0);
        int count = 0;
        for(int i = 0;i<temperatures.size();i++)
        {
            int day = temperatures.size();
            for(int j = i+1;j<temperatures.size();j++)
            {
                if(temperatures[j] > temperatures[i])
                {
                    day = j;
                    break;
                }
            }
            if(day == temperatures.size()) res[i] = 0;
            else res[i] = day-i;
        }
        return res;
    }
};

暴力解法

添加一个辅助数组next,用来记录每个温度第一次出现的下标,最开始初始化为无穷大。
反向遍历温度列表,在next数组中寻找比当前温度高的每个温度第一次出现的下标。然后记录其中的最小值minval,如果该最小值不再是无穷大,那么说明等待天数为minval - i,然后更新next[temperatures[i]] = i

由于是反向遍历,所以当考虑temperatures[i]时只有温度列表在i之后的值被访问更新过,如果next[j]不为无穷大那么就会找到比temperatures[i]大的温度。而由于next[i]记录的是温度第一次出现的下标,所以后续出现相同的温度会被覆盖更新

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> res(temperatures.size(),0);
        vector<int> next(101,INT_MAX);

        for(int i = temperatures.size()-1;i>=0;i--)
        {
            int minval = INT_MAX;
            for(int j = temperatures[i]+1;j<=100;j++)
            {
                minval = min(minval,next[j]);
            }
            if(minval != INT_MAX)
            {
                res[i] = minval - i;
            }
            next[temperatures[i]] = i;
        }

        return res;
    }
};

单调栈

  1. 单调栈里面存放的元素
    就是当前元素的下标
  2. 单调栈是递增还是递减
    应该是采用递增的,即从栈头到栈底应该是递增的。
    对于数组我们从前向后遍历,然后不断将下标压入栈中,如果下标元素比当前栈中的元素大,那么就先弹出,再压入
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> res(temperatures.size(),0);
        stack<int> check;
        check.push(0);
        for(int i = 1;i<temperatures.size();i++)
        {
            while(!check.empty() && temperatures[i] > temperatures[check.top()])
            {
                res[check.top()] = i - check.top();
                check.pop();
            }
            //当前元素小于或者等于目前栈顶元素
            check.push(i);
        }
        return res;
    }
};

496.下一个更大元素I

文档讲解:代码随想录
视频讲解: 单调栈,套上一个壳子就有点绕了| LeetCode:496.下一个更大元素
状态

本质上就是找nums2中一些数的右边第一个大值,我们可以利用map来存储nums1里面的数据这样当我们使用单调栈去求nums2中元素右边的第一个大值时,当当前元素是nums1中的元素我们就对结果数组res进行更新。

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res(nums1.size(),-1);
        unordered_map<int,int> nums2map;
        if (nums1.size() == 0) return res;
        //利用map来存储下标 方便查找
        for(int i = 0;i<nums1.size();i++)
        {
            nums2map[nums1[i]] = i;
        }
        stack<int> check;
        check.push(0);
        //寻找nums2中每个元素的右边第一个大值
        for(int i = 1;i<nums2.size();i++)
        {
            //如果小于等于此时的栈顶元素 压入
            if(nums2[i] <= nums2[check.top()])
            {
                check.push(i);
            }
            else
            {
                //当大于此时的栈顶元素
                while(!check.empty()&&nums2[i] > nums2[check.top()])
                {
                    //判断栈顶元素是否是nums1中的值
                    if(nums2map.count(nums2[check.top()]) > 0)
                    {
                        //如果是就记录更新res
                        //nums2map[nums2[check.top()]] 下标
                        res[nums2map[nums2[check.top()]]] = nums2[i];
                    }
                    //弹出当前栈顶
                    check.pop();
                }
                //压入大值
                check.push(i);
            }
        }
        return res;
    }
};
YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列 感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题 阅读详情

相关推荐

Intouch间接变量(扩展)

间接变量只是Intouch提供给开发者的便捷方式之一,并不是所有情况都一定要使用间接变量,有时候用条件语句或者内存变量的方式也能起到类似的作用。

weixin_41571357的博客 2168

letcode 739 每日温度

由于温度范围在 [30, 100] 之内,因此可以维护一个数组 next 记录每个温度第一次出现的下标。数组 next 中的元素初始化为无穷大,在遍历温度列表的过程中更新 next 的值。对于温度列表中的每个元素 temperatures[i],需要找到最小的下标 j,使得 i < j 且 temperatures[i] < temperatures[j]。天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。返回的是当天温度后第一次温度上升的天数;,表示每天的温度,返回一个数组。

weixin_48560325的博客 672

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

【Day62】代码随想录之单调栈_739. 每日温度_496.下一个更大元素 I

和温度一样要找出右侧第一个比当前元素大的值,但是在找的时候需要查询当前元素在nums1中在不在,在的话保存值,而不是距离。因为用到查询是不是在nums1中存在,unordered_map<int, int>哈希表的底层逻辑查找效率是O(1),保存nums1中的数组下标和数组元素。单调栈是栈里是数组的下标,下标对应的数组元素是有序的。根据栈里的单调,当前遍历元素和栈顶一直抵消,直到栈顶元素大于遍历元素。,这可能会超,我试了试,确实超了,用一个很大的全都一样的数组就超了。栈顶元素大于遍历元素:入栈保留。

weixin_46275441的博客 397

【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】

生成KEIL工程之后,勾选上use MicroLIB,代码上暂时无需做其他修改,编译下载。由于使用了FreeRTOS,因此系统的TimeBase Source修改成TIM1。在CubeMx上面选择NUCLEO-F429ZI开发板,并采用默认配置。打开电脑命令行,去ping这设置好的IP,能够实现Ping通。使能LWIP,并且先禁用DHCP,设置好静态IP。修改defaultTask的栈大小。Platform选择LAN8742。修改堆栈大小,生成工程。使能FreeRTOS。

qq_42617357的博客 6111

NOAA气象数据下载攻略

各方搜寻气象数据下载途径,发现网上最多的就是从NOAA下载,但是中途有尝试过很多次都没有下载到,每次都是显示不可用,今天终于下载成功了,特此记录。 首先我是从这个网址进入的:National Centers for Environmental Information (NCEI) formerly known as National Climatic Data Center (NCDC) | NCEI offers access to the most significant archives of oc

lianqian66的博客 3万+

代码随想录训练营Day 62|力扣739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

代码:(单调栈)思路:感觉这个单调栈的玩法有种消消乐的感觉(?保证单调栈里的元素都是单调递增的,如果遇到一个比栈顶元素大的数据,就去消消乐,消到只剩比它大的元素。易错点:消消乐的过程要用循环!!消完所有可以抵消的再将当前遍历元素入栈。

weixin_64434454的博客 408

qq对接openclaw,通过qq发送命令

把 OpenClaw 接入 QQ 和微信,目前主流的微信文章和教程主要提供了两种截然不同的路径。我为你梳理了它们的核心区别和关键步骤,你可以根据自己的需求来选择。

suny8的专栏 270

代码随想录算法训练营day62 | 739. 每日温度、496.下一个更大元素 I 、503.下一个更大元素II

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。使用单调栈主要有三个判断条件。

sunflowers11的博客 402

【27】软考软件设计师——数据流图(DFD)补全题满分精讲|下午15分大题深度拆解

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第27篇,深度精讲**下午案例题第1道必考大题:数据流图(DFD)补全**,该题单题分值高达**12 ~ 15分**,是整张试卷最稳的保底得分大题。我结合多年备考复盘与真题阅卷规则,超详细拆解DFD四大核心元素标准定义、机考绘图规范、三层分层逻辑、**父图子图平衡刚性扣分规则**,升级强化版「DFD满分补全三步法」;复刻历年高频真题完整流程,拆解缺失数据流定位、实体/存储辨析、平衡改错、文字需求对照全流程,配套**阅卷满分答题话术、机考避坑细则

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 590

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

代码随想录算法训练营day58|739.每日温度496.下一个更大元素I 剑指offer14-I、57-II、62

unordered_map底层实现是哈希表,查找效率是O(1),map和multimap底层实现是红黑树,查找效率是O(logn),所以选择unordered_map。同时也要注意之后的比较结果会把之前的结果覆盖,但是我们要的是第一个比当前元素大的元素。单调栈适合于求当前元素左面或者右面第一个比当前元素大或者小的元素。找右边比当前元素大的元素,需要保持单调栈里的元素是单调递增的。主要的问题还是:1、明确单调栈里记录的是下标而不是元素值2、栈顶元素和遍历到的当前元素的区别,还是要多理解。

weixin_44735258的博客 446

手把手教你学基于 Linux 的 NPU 固件开发-第 10 讲:可靠性设计(RAS)——让系统坚如磐石错误检测、纠正与上报机制(ECC、Parity)

组件推荐保护机制备注HBM/DDRScrubbing必须开启,定期巡检片上 SRAMECC(权重/激活值),Parity(指令)权衡面积与可靠性计算单元ABFT或DMR(关键路径)防止计算逻辑错误片上网络CRC重传保证数据传输完整性系统软件AER 上报CE 监控自动恢复闭环管理,杜绝 SDC运维策略预测性维护Checkpoint变被动为主动核心心法(信任硬件,但必须验证。在纳米尺度下,错误是必然发生的物理现象。

MHD0815的博客 90

【Day62】代码随想录值单调栈part1——每日温度、下一个更大元素I

单调栈本质就是一个栈,但是需要保证栈中的元素是递增或者递减;单调栈中放下标,通过下标做差值来计算距离;递增:当前左边或者右边第一个比他大的元素;递减:当前左右或右边第一个比他小的元素。单调栈的作用:是为了存放遍历过的元素,然后和当前遍历的元素做对比。

格子格鸽的个人博客 782

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

day62 单调栈 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

m0_68259754的博客 1036

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

随想录Day62 | 单调栈 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

weixin_44645059的博客 545

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

day62 单调栈part01(739. 每日温度496. 下一个更大元素 I)

中等提示给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

weixin_43889767的博客 598

算法训练营 day62 单调栈 每日温度 下一个更大元素 I

因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。

qq_54343969的博客 660

代码随想录Day62

思路:循环遍历,每次要遍历到自己的下标,我需要写一个函数,从自己的下标出发,再回到自己的下标,找到比自己大的值。stack.push要在while之后,因为要先处理完较小的元素,才能推入元素。思路:双指针,一个指针遍历元素,一个指针寻找下一个更大值。思路:这个不就是上一道题多加一层for循环?

Allen_7_kklt的博客 507

Day 62 | 单调栈 739. 每日温度 、496.下一个更大元素 I

【代码】Day 62 | 单调栈 739. 每日温度 、496.下一个更大元素 I。

m0_46554918的博客 352

Day62:单调栈 LeedCode503. 下一个更大元素 II 42. 接雨水

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。如果当前遍历的元素(柱子)高度等于栈顶元素的高度,要跟更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度。如果当前遍历的元素(柱子)高度小于栈顶元素的高度,就把这个元素加入栈中,因为栈里本来就要保持从小到大的顺序(从栈头到栈底)。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid]

2301_76352996的博客 1120

【代码随想录训练营】【Day 62】【单调栈-1】| Leetcode 739, 496, 503

【代码随想录训练营】【Day 62】【单调栈-1】| Leetcode 739, 496, 503。

qq_44574200的博客 561

day62 ● 739. 每日温度 ● 496.下一个更大元素 I

496.下一个更大元素 I。

m0_58298553的博客 291

训练营打卡Day62

训练营打卡Day62

hhk166的专栏 110

@ 代码随想录算法训练营第9周(C语言)|Day62(单调栈)

找当前数组比当前元素大的数,使用单调递增的单调栈。使用hash进行快速查找元素坐标。

fu1034810010的博客 423

DAY62 单调栈day1

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素。将nums1中元素加入unordered_map,对nums2处理时,判断是不是所求的nums1中有的元素,如果有,则进行求解,否则不必更新result。使用单增栈,且result初始化为-1,大小为nums1大小——如果不存在下一个更大元素,那么本次查询的答案是 -1。3.重复,至满足当前元素入栈条件,当前元素入栈。

weixin_45845722的博客 99
上一篇: 代码随想录Day60 | 647. 回文子串 516.最长回文子序列
下一篇: 代码随想录Day63 |503.下一个更大元素II 42. 接雨水
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值