leetcode-739.每日温度-单调栈
739. 每日温度
739.每日温度 - 力扣
解题思路:单调栈
题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
解析:
这是接触的第一道单调栈类型的题目。
单调栈的主要思想是:栈中元素保持单调递增或者单调递减。为了保持这种单调性,需要(以单调递减为例)遇到一个大于栈顶元素的数时,不断pop栈中元素,直到栈顶元素大于新遇到的元素,然后将新元素push进栈;遇到一个小于栈顶元素的数时,就直接将新的元素push进栈。
单调栈的经典题目是找到第i个元素之后第一个大于它的下标,此题与739不能说毫无相干,只能说一模一样。下面首先讲解单调栈的经典题目思路。
O(n^2)
的做法是,遍历所有元素,再遍历此元素之后的所有元素,找到第一个大于它的元素下标。但这种方法时间复杂度过高,有没有O(n)
的做法,只需遍历一次就完成题目呢?
答案是:有!
不过首先要明确对于遍历的作用。在O(n^2)
的做法中,外层遍历是在确定寻找第一个大于当前元素
的开始下标,然后再到内层循环中去真正地寻找。使用这种思路必定需要O(n^2)
的时间复杂度。现在我们换一种思路,让循环的index表示以当前元素作为第一个大于的元素下标
,然后去找在index之前的、没有找到第一个大于它的元素的下标的、小于index对应元素的元素下标(这句话有点拗口)。那么我们就需要一个数据结构来存储【在index之前的、没有找到第一个大于它的元素的下标的、小于index对应元素的元素下标】。
单调栈这个数据结构刚好可以满足我们的需求。使用一个单调递减的单调栈,若新的元素(循环的index对应的元素)大于栈顶元素,那么对于栈顶元素来说,它就找到了目标的下标,所以记录它的NGE(Next Greater Element)后就将它pop出,然后判断新的栈顶元素是否也小于新的元素。最后还需要将新元素push进栈,因为新元素也需要找到它的NGE。若新的元素小于栈顶元素,那么说明没有元素以它为NGE,就不pop栈的任何元素,同时将新元素push进栈,因为新元素也需要找到它的NGE。
至此,经典题的思路以及很清晰了,核心思想就在于使用单调栈来存储尚未找到NGE的元素下标。
而739.每日温度这道题,和经典题的唯一区别就在于,它找的不是第i个元素之后第一个大于它的下标,而是第一个大于它的元素与它的距离
,那么只需要在记录时记录距离就好了。
代码:
使用javascript实现
var dailyTemperatures = function(temperatures) {var ans = Array(temperatures.length).fill(0);var stack = [];for(let i=0; i<temperatures.length; i++){while(stack.length!=0 && temperatures[stack[stack.length-1]]<temperatures[i]){ans[stack[stack.length-1]] = i-(stack[stack.length-1]);// 与经典题目唯一的区别。stack.pop();}stack.push(i);}return ans;
};
leetcode-739.每日温度-单调栈相关推荐
- leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码
如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...
- 184、【栈与队列】leetcode ——739. 每日温度(C++版本)
题目描述 参考文章:739. 每日温度 解题思路 (1)暴力法 每次遍历到一个数时,就再开辟一个变量找此数后面第一个大于它的数,找到则添加,没找到则返回0. class Solution {publi ...
- 【LeetCode】【HOT】739. 每日温度(栈)
[LeetCode][HOT]739. 每日温度 文章目录 [LeetCode][HOT]739. 每日温度 package hot;import java.util.ArrayDeque; impo ...
- 2020-06-11 LeetCode 739 每日温度 C++
题目:739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 t ...
- LeetCode 739. 每日温度(单调栈)
1. 题目 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatu ...
- leetcode - 739. 每日温度
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表temperatures=[73 ...
- Leetcode 739. 每日温度 (每日一题 20211014)
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替.示例 1:输入: temperatures = [7 ...
- leetcode 栈739. 每日温度
739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替.例如,给定一个列表 temperatures ...
- 力扣739. 每日温度
739. 每日温度 - 力扣(LeetCode) (leetcode-cn.com) 暴力 class Solution {public int[] dailyTemperatures(int[] t ...
- 739. 每日温度 golang
739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temper ...
最新文章
- 使用Python和OpenCV实现超快速,简单的伽玛校正功能
- 算法--------字符串中的第一个唯一字符(Java 版本)
- 物理主机安装linux的方法
- 软件测试文档在哪里,软件测试报告技术文档
- Angular bootstrap的一个例子
- pythonselenium函数_selenium2.0 关于 python 的常用函数汇总
- beeline安装_Hive 系列 之 简介与安装
- python如何使用ppip安装xlwt_如何安装python xlwt
- BOS系统的设计与实现
- 一分钟解决微信小程序截图(截屏问题)
- Excel竟然能够按照单元格的指定颜色顺序排序
- 奉子成婚,永远不可能成为潮流
- CocoaPods使用小结
- c语言键盘函数key,c语言获得键盘的按键
- 尺寸不会再乱 主板板型规格知识大解析
- 计算机房 增加电脑,(完整版)学生计算机房(电脑室)使用须知
- 大话 JS 单线程与异步
- 开题报告:基于java电子商务购物商城网站系统 毕业设计论文开题报告模板
- JavaScript循环语句的性能问题
- 用python-OpenCV做一个魔方墙找茬程序(3D视眼训练) 版本2.0:加入倒计时功能
热门文章
- Spring @Aspect注解
- 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
- 免费混合虚拟化OVM数据中心解决方案
- 计算机等级考试四级网络工程师真题,计算机四级网络工程师试题及答案
- op 圣诞节活动_圣诞节到了–这是我们精选的IT饼干笑话
- matlab中appdesigner的控件简单讲解
- Spring boot 项目(十五)——实现163邮箱发送邮件
- 平方米的计算机公式,表格中平方米计算公式(怎么用excel计算平方)
- 安徽理工大学计算机设计大赛,安徽理工大学学子在2020年中国大学生计算机设计大赛中喜获佳绩...
- 谈一下我对OOP的了解