题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

解题思路

这个题目可以看做是从左往右找第一个比这个数大(或者小)的数的位置,然后求出下标只差就可以了。说是很容易,但是如果做的话,最暴力的方法:我们求第i位置的时候,从该位置开始找到右边第一个比这个数大的数的位置时结束本次遍历。一次类推,这样下来的时间复杂度是O(n^2).这种简单暴力的方法应该都能够想出来。用单调栈的方法能够以O(n)的时间复杂度完成本次操作:

我们设置一个栈,其中要求这个栈从栈底到栈顶是单调递减的。我们在入栈的时候不进行任何操作,当不满足单调栈的从栈底到栈顶由大变小的规则时,我们就需要将栈顶元素弹出,在弹出时我们才进行相关操作,也就是说,只有栈需要弹出时才能激发操作。这个操作就是“终于遇到了比栈顶元素大的右边第一个数了”,这时候我们就记录这个位置比栈顶元素所在的位置大多少(下标差),只要一直不满足这个单调栈的规定,就一直弹出,一直记录结果,最后遍历完毕整个数组,剩下的栈内元素都是那些右边不存在比该位置更大的数了,所以直接填写0即可。

整个过程可以按照以下的伪代码执行:

对于T[i]:    i:0~(length-1){

if(stack为空 || T[i]<=栈顶元素){

将T[i]压入栈;

continue;

}

while(栈不为空&&T[i]大于栈顶元素的值){

result【栈顶元素的下标】 = i(当前元素的下标) -  栈顶元素的下标;
                弹出栈顶元素;
            }
            while(栈顶元素非空){
            result[栈顶元素下标] = 0;

弹出栈顶元素。
        }

}

下面是代码:Leetcode-739 每日温度(git)Leetcode-739

vector<int> dailyTemperatures(vector<int>& T) {stack<pair<int,int>> st;int size = T.size();vector<int> res(size,0);if(size<=1) return res;for(int i=0;i<T.size();i++){if(st.empty() || T[i]<=st.top().first){st.push(make_pair(T[i],i));continue;}while(!st.empty()&&T[i]>st.top().first){        //遇到比栈的头结点大的就全部进行弹出,只有在弹出数据的时候往结果数据集合填充数据。res[st.top().second] = i - st.top().second;st.pop();}st.push(make_pair(T[i],i));}while(!st.empty()){res[st.top().second]=0;st.pop();}return res;
}

leetcode 739 解法思路相关推荐

  1. Github标星59.7k:用动画的形式呈现解LeetCode题目的思路

    前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个59700多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...

  2. 推荐:用动画的形式呈现解LeetCode题目的思路(github上25000多star)

    前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个25000多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...

  3. 函数与导数题目类型和解法思路的总结

    函数与导数类题型及解法思路总结 1.已知$\underline{函数不等式}$恒成立,求参数的取值范围: 模型:$A\leq f(x)$恒成立,等价于$A\leq f(x)_{min}$:$A\ge ...

  4. Leetcode 739:每日温度(超详细的解法!!!)

    根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替. 例如,给定一个列表 temperatures = [73, 74 ...

  5. leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码

    如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...

  6. CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)

    参考例题 https://blog.csdn.net/weixin_45556441/article/details/115091036 引子 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码 ...

  7. leetcode 巧妙解法 387. 字符串中的第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...

  8. C#:魔术师发牌-解法思路

    1.魔术师发牌-问题来源? 魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:"我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示.& ...

  9. leetcode 1737 解题思路及注释code 贪心

    备忘录 最近在刷leetcode,好不容易搞懂一道题,还是希望记录下来,以防之后忘记,也希望可以分享给大家思路. 题目要求 给你两个字符串 a 和 b ,二者均由小写字母组成.一步操作中,你可以将 a ...

  10. 路径字符串生成树形结构的思路_资源推荐!顶级程序员必刷宝典!LeetCode中文解题思路重磅问世!...

    今天推荐一个Github资源,该主题是中文LeetCode解题思路,让你完美应对公司笔试! LeetCode简介 LeetCode收录了许多互联网公司的算法题目,被称为刷题神器. 资源内容 第一个部分 ...

最新文章

  1. 《JavaScript高级程序设计 第3版》-学习笔记-1
  2. Android LK Bootlaoder启动概览
  3. boost::graph_property_iter_range用法的测试程序
  4. SAP Cloud Platform和S/4HANA的互联
  5. bind 0.0.0.0的作用是什么呢?
  6. WinDbg 命令三部曲:(一)WinDbg 命令手册
  7. 厉害了!Spring Boot 2.5正式发布
  8. 动态规划——命运(hdu2571)
  9. innodb 集群_部署MySQL InnoDB集群以实现高可用性
  10. maven settings.xml 包含多个镜像库
  11. 使用RN开发App,引入图标失效问题的解决
  12. 没登录的计算机怎么远程桌面,没有远程登陆工具如何远程电脑 如何用向日葵实现远程登陆?...
  13. 信息奥赛课课通(C++)p139-例3幸运数的划分
  14. 618运动装备推荐、这几款产品都是运动必备
  15. 苏州科技计算机网络,苏州科技学院-计算机网络大作业-某高校校园网设计.doc
  16. 1396:病毒 (拓扑序)
  17. 2016年,续航新能量
  18. fastdfs上传文件的简易方法
  19. JAVA WEB之XSS防御工具类代码示例
  20. java常见的5个异常_Java中常见的五种异常

热门文章

  1. SVN版本控制—branches、trunk、tag篇
  2. 申请计算机软件著作权费用,申请计算机软件著作权费用多少有哪些费用
  3. 计算机win7设置用户密码,win7怎么设置开机密码 win7设置开机密码步骤盘点【详解】...
  4. 林利军2018年致投资人的信:这是一个极致者胜的时代
  5. 平安保险的万能险怎么样?
  6. 正点原子开发板 使用 mfgtool 上位机固化系统至emmc报错 mfgtool “Push“ error, file=“xxxxx“
  7. DeepFM 参数理解(二)
  8. 个人网站可以申请微信授权登录吗?
  9. 504 压测geteway_504 Gateway Time-out是怎么回事?
  10. 游戏开发中的数学基础