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.每日温度-单调栈相关推荐

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

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

  2. 184、【栈与队列】leetcode ——739. 每日温度(C++版本)

    题目描述 参考文章:739. 每日温度 解题思路 (1)暴力法 每次遍历到一个数时,就再开辟一个变量找此数后面第一个大于它的数,找到则添加,没找到则返回0. class Solution {publi ...

  3. 【LeetCode】【HOT】739. 每日温度(栈)

    [LeetCode][HOT]739. 每日温度 文章目录 [LeetCode][HOT]739. 每日温度 package hot;import java.util.ArrayDeque; impo ...

  4. 2020-06-11 LeetCode 739 每日温度 C++

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

  5. LeetCode 739. 每日温度(单调栈)

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

  6. leetcode - 739. 每日温度

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

  7. Leetcode 739. 每日温度 (每日一题 20211014)

    请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替.示例 1:输入: temperatures = [7 ...

  8. leetcode 栈739. 每日温度

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

  9. 力扣739. 每日温度

    739. 每日温度 - 力扣(LeetCode) (leetcode-cn.com) 暴力 class Solution {public int[] dailyTemperatures(int[] t ...

  10. 739. 每日温度 golang

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

最新文章

  1. 使用Python和OpenCV实现超快速,简单的伽玛校正功能
  2. 算法--------字符串中的第一个唯一字符(Java 版本)
  3. 物理主机安装linux的方法
  4. 软件测试文档在哪里,软件测试报告技术文档
  5. Angular bootstrap的一个例子
  6. pythonselenium函数_selenium2.0 关于 python 的常用函数汇总
  7. beeline安装_Hive 系列 之 简介与安装
  8. python如何使用ppip安装xlwt_如何安装python xlwt
  9. BOS系统的设计与实现
  10. 一分钟解决微信小程序截图(截屏问题)
  11. Excel竟然能够按照单元格的指定颜色顺序排序
  12. 奉子成婚,永远不可能成为潮流
  13. CocoaPods使用小结
  14. c语言键盘函数key,c语言获得键盘的按键
  15. 尺寸不会再乱 主板板型规格知识大解析
  16. 计算机房 增加电脑,(完整版)学生计算机房(电脑室)使用须知
  17. 大话 JS 单线程与异步
  18. 开题报告:基于java电子商务购物商城网站系统 毕业设计论文开题报告模板
  19. JavaScript循环语句的性能问题
  20. 用python-OpenCV做一个魔方墙找茬程序(3D视眼训练) 版本2.0:加入倒计时功能

热门文章

  1. Spring @Aspect注解
  2. 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
  3. 免费混合虚拟化OVM数据中心解决方案
  4. 计算机等级考试四级网络工程师真题,计算机四级网络工程师试题及答案
  5. op 圣诞节活动_圣诞节到了–这是我们精选的IT饼干笑话
  6. matlab中appdesigner的控件简单讲解
  7. Spring boot 项目(十五)——实现163邮箱发送邮件
  8. 平方米的计算机公式,表格中平方米计算公式(怎么用excel计算平方)
  9. 安徽理工大学计算机设计大赛,安徽理工大学学子在2020年中国大学生计算机设计大赛中喜获佳绩...
  10. 谈一下我对OOP的了解