Leetcode 剑指 Offer II 038. 每日温度

这篇具有很好参考价值的文章主要介绍了Leetcode 剑指 Offer II 038. 每日温度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

  • 输入: temperatures = [73,74,75,71,69,72,76,73]
  • 输出: [1,1,4,2,1,1,0,0]

示例 2:

  • 输入: temperatures = [30,40,50,60]
  • 输出: [1,1,1,0]

示例 3:

  • 输入: temperatures = [30,60,90]
  • 输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 10^5
  • 30 <= temperatures[i] <= 100

题目思考

  1. 可以使用什么数据结构模拟整个过程?

解决方案

思路
  • 分析题目, 最容易想到的思路是暴力两层循环: 外层遍历每个起点, 内层遍历之后第一个更高温度, 两者下标差值就是当前位置至少等待的天数
  • 但这样的时间复杂度达到了 O(N^2), 根据题目输入规模, 肯定会超时, 如何优化呢?
  • 正向遍历时, 由于我们无法知道后续温度情况, 所以只能暴力, 那么我们换个思路, 采用逆序遍历, 实时统计当前后续温度分布
  • 这里如果我们只维护最大温度和对应下标是不够的, 因为某个温度的后面更高温度中, 离它最近的并不一定就是整个后面最高的温度
  • 所以我们需要维护一个递增的温度和其下标列表, 从而快速定位每个温度后面的第一个更高温度
  • 根据需求, 我们可以采用单调栈的方式来实现它, 栈里面存储下标, 且保证从栈顶到栈底的下标和温度都是递增的
  • 在逆序遍历每个温度时, 先将栈顶小于等于它的温度弹出, 原因如下:
    • 当前温度更高, 且下标更小, 意味着再向前遍历时, 最近的更高温度只可能是当前温度, 而不可能再是后面的栈顶温度了
    • 换句话说, 栈顶已经没用了, 所以可以安全弹出
  • 然后判断栈中是否还有元素:
    • 如果有, 则栈顶就是后面最近的更高温度 (否则会在上一步被弹出), 它与当前下标的差值即为需要等待的天数
    • 如果没有, 则说明后续没有更高的温度, 等待天数是 0
  • 最后将当前下标压入栈中, 此时栈中存储的下标和对应的温度从栈顶到栈底都是单调递增的
  • 下面的代码就对应了上面的整个过程, 并且有详细的注释, 方便大家理解
复杂度
  • 时间复杂度 O(N): 数组每个元素最多处理 2 遍 (压入和弹出栈)
  • 空间复杂度 O(N): 栈最多存 N 个元素
代码
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        stack = []
        # 初始化等待天数都是0
        res = [0] * n
        for i in range(n)[::-1]:
            # 逆序遍历每日温度
            t = temperatures[i]
            while stack and temperatures[stack[-1]] <= t:
                # 栈顶存在且其温度不超过当前温度, 弹出
                # 因为再向前遍历时, 最近的更高温度只可能是当前温度, 而不可能再是后面的栈顶温度了
                # 换句话说, 栈顶已经没用了, 所以可以安全弹出
                stack.pop()
            if stack:
                # 如果栈中仍有元素, 则栈顶就是后面最近的更高温度 (否则会在上一步被弹出)
                # 它与当前下标的差值即为需要等待的天数
                res[i] = stack[-1] - i
            # 如果栈中没有元素, 则说明后面没有更高温度了, 使用默认值0
            # 然后将当前下标压入栈中, 此时栈中存储的下标和对应的温度从栈顶到栈底都是单调递增的
            stack.append(i)
        return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊文章来源地址https://www.toymoban.com/news/detail-628368.html

到了这里,关于Leetcode 剑指 Offer II 038. 每日温度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 剑指 Offer II 091. 粉刷房子

    题目链接:leetcode 剑指 Offer II 091 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也

    2024年02月11日
    浏览(29)
  • Leetcode 剑指 Offer II 042. 最近的请求次数

    题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请实现 RecentCounter 类: RecentCounter() 初始化

    2024年02月10日
    浏览(33)
  • LeetCode:剑指 Offer 58 - II. 左旋转字符串

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋

    2024年02月02日
    浏览(33)
  • (链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

    难度:简单 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入 : 1-2-3-4-5-NULL 输出 : 5-4-3-2-1-NULL 限制 : 0 = 节点个数 = 5000 注意:本题与 206. 反转链表 相同。 💡思路: 法一:递归 可以将本问题分解成子问题: 1 - (剩余部分的反转)

    2024年02月15日
    浏览(35)
  • Leetcode-每日一题【剑指 Offer 29. 顺时针打印矩阵】

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 限制: 0 = matrix.length = 100 0 = matrix[i].length = 100 1.题目要求

    2024年02月13日
    浏览(46)
  • Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入: x = 2.00000, n = 10 输出: 1024.00000 示例 2: 输入: x = 2.10000, n = 3 输出: 9.26100 示例 3: 输入: x = 2.00000, n = -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 提示: -10

    2024年02月13日
    浏览(28)
  • Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入: head = [1,3,2] 输出: [2,3,1] 限制: 0 = 链表长度 = 10000 1.题目要求我们从尾到头反过来返回每个节点的值,这道题我们可以用栈去解决,但是我们还可以采用另一种方法。就是我们可以

    2024年02月13日
    浏览(28)
  • (字符串 ) 剑指 Offer 05. 替换空格 ——【Leetcode每日一题】

    难度:简单 请实现一个函数,把字符串 s 中的每个 空格 替换成 “ %20 ”。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 限制 : 0 = s 的长度 = 10000 💡思路:双指针法 如果想把这道题目做到 极致 ,就不要只用额外的辅助空间了! 首先扩充数组到每个空格替换

    2024年02月08日
    浏览(33)
  • Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的

    2024年02月14日
    浏览(31)
  • Leetcode-每日一题【剑指 Offer 26. 树的子结构】

    输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A:      3     /    4   5   /  1   2 给定的树 B:    4    /  1 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包