Leetcode 739:每日温度(超详细的解法!!!)
根据每日 气温
列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0
来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
。
提示:气温
列表长度的范围是 [1, 30000]
。每个气温的值的都是 [30, 100]
范围内的整数。
解题思路
典型的单调栈问题。关于单调栈的问题,我们之前也碰到过Leetcode 84:柱状图中最大的矩形(超详细的解法!!!)。我们这里的问题就是要找到大于当前元素的第一个元素的位置,所以我们可以先将temperatures
反转,然后我们通过建立一个严格单调递减的栈。如
首先将temperatures
反转就变成了[73, 76, 72, 69, 71, 75, 74, 73]
。
假设我们现在考虑71
,此时我们的栈中存有[73,72,69]
。
我们发现71
大于栈顶元素,所以我们要将69
出栈,然后将71
压入。并且我们此时可以知道比71
大的第一个元素就是72
,所以此时,我们只需要通过72.index
减去71.index
就可以得到结果,最后我们得到所有结果后再将结果反转即可。
class Solution:def dailyTemperatures(self, T):""":type T: List[int]:rtype: List[int]"""stack = list()T.reverse()res = []for i, val in enumerate(T):while stack and T[stack[-1]] <= val:stack.pop()if stack:res.append(i - stack[-1])else:res.append(0)stack.append(i)res.reverse()return res
稍微简化一下代码
class Solution:def dailyTemperatures(self, T):""":type T: List[int]:rtype: List[int]"""res = [0] * len(T)stack = []for i in range(len(T) - 1, -1, -1):while stack and T[i] >= T[stack[-1]]:stack.pop() if stack:res[i] = stack[-1] - istack.append(i)return res
知道这种思路后,我们可以很快的写出更加简洁的做法。我们不需要将T.reverse()
,而是直接建立一个非严格单调递减的栈,当我们碰到一个元素大于栈顶元素的时候,我们知道此时这个元素一定是离栈顶元素最近的那个最大值的点,我们只要测试记录两者之间的位置距离就好啦。
class Solution:def dailyTemperatures(self, T):""":type T: List[int]:rtype: List[int]"""res = [0] * len(T)stack = []for i, t in enumerate(T):while stack and T[stack[-1]] < t:cur = stack.pop()res[cur] = i - curstack.append(i)return res
reference:
https://leetcode.com/problems/daily-temperatures/discuss/136017/Elegant-Python-Solution-with-Stack
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
Leetcode 739:每日温度(超详细的解法!!!)相关推荐
- 184、【栈与队列】leetcode ——739. 每日温度(C++版本)
题目描述 参考文章:739. 每日温度 解题思路 (1)暴力法 每次遍历到一个数时,就再开辟一个变量找此数后面第一个大于它的数,找到则添加,没找到则返回0. class Solution {publi ...
- 2020-06-11 LeetCode 739 每日温度 C++
题目:739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 t ...
- leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码
如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...
- LeetCode 739. 每日温度(单调栈)
1. 题目 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatu ...
- leetcode - 739. 每日温度
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表temperatures=[73 ...
- Leetcode 739. 每日温度 (每日一题 20211014)
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替.示例 1:输入: temperatures = [7 ...
- Leetcode 496:下一个更大元素 I(超详细的解法!!!)
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...
- 【LeetCode】【HOT】739. 每日温度(栈)
[LeetCode][HOT]739. 每日温度 文章目录 [LeetCode][HOT]739. 每日温度 package hot;import java.util.ArrayDeque; impo ...
- Leetcode 1162:地图分析(超详细的解法!!!)
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...
最新文章
- ubuntu 16.0.4 配置 tensorflow-gpu 1.1.0
- python2使用openpyxl_使用openpyxl for Python2.6有些困难
- 黑莓 7290 快捷键
- 华为认证hcia含金量_华为hcna认证用处大吗 什么是hcna
- MapInfo mif/mid文件说明
- python列表获取最后一项_如何在Python中获取列表的最后一项?
- 初学Python——协程
- 深度学习之神经网络基础(1)——感知器,S型神经元,梯度下降法,神经网络架构
- 文献阅读:Improving neural networks by preventing co-adaptation of feature detectors
- linux man 中文 mac,技术|MAC 系统中显示中文MAN手册
- java的字典序排序_java字典序排序
- 如何黑入安卓手机(ezsploit)
- 通过NFS挂载根文件系统——TQ2440
- html ajax 图片上传,Ajax实现图片上传并预览功能
- Android中常见五种布局管理器——RelativeLayout、LinearLayout、FrameLayout、TableLayout、GridLayout
- 安邦信AMB100系列通用变频器通过PID功能实现恒压供水的基本方法
- 我们为什么要学习JAVA?
- UI设计师ps的使用,产品经理
- 制作学术PPT和演讲的要点
- 多媒体信息检索技术简介
热门文章
- MATLAB永磁同步电机电角度,永磁同步电动机矢量控制
- 淘某某宝app接口最新xsign算法分析
- 【强化学习论文合集】二十.2019机器人与自动化国际会议论文(ICRA2019)
- ios12控制中心打不开相机和计算机,如何修复iPhone 12相机无法正常工作?
- oracle oam nginx,如何基于 OAM 编写一个扩展 Trait?
- 苹果7手机严重卡顿_为什么安卓机用久了会卡顿,苹果却不会?这一点决定手机卡不卡!...
- 【190223】基于MWP的VC++所播放器源程序源代码
- 华为路由器CVE-2017-17215-HG532
- Python:初步完成IE浏览器的查询、点击和文件下载
- NB-IoT从原理到实践 学习笔记 Part 13-19 NRS,NPBCH,NPDCCH,NPDSCH,NPRACH,NPUSCH,DMRS