【力扣】739. 每日温度 <单调栈>

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

【力扣】739. 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 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 <= 1 0 5 10^5 105
30 <= temperatures[i] <= 100

题解

  通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时就要想到可以用单调栈。时间复杂度为O(n)。
  单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。更直白来说,就是用一个栈来记录遍历过的元素,因为遍历数组的时候,不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以需要用一个容器(这里用单调栈)来记录我们遍历过的元素。

使用单调栈的时候首先要明确如下几点:

  • 单调栈里存放的元素是什么?
    单调栈里只需要存放元素的下标 i i i 就可以了,如果需要使用对应的元素,直接 T [ i ] T[i] T[i] 就可以获取。

  • 单调栈里元素是递增呢? 还是递减呢?(从栈头到栈底的顺序)
    如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。

  本题其实就是找找到一个元素右边第一个比自己大的元素,此时就应该想到用单调栈。

class Solution {
public static int[] dailyTemperatures(int[] temperatures) {
		//单调栈只存放下标
        Stack<Integer> stack = new Stack<>();
        int[] result = new int[temperatures.length];
       
       //先放入第一个元素下标
        stack.push(0);

        for (int i = 1; i < temperatures.length; i++) {
            //情况1:小于
            if (temperatures[i] < temperatures[stack.peek()]) { 
                stack.push(i);
            }
            //情况2:等于
            else if (temperatures[i] == temperatures[stack.peek()]){  
                stack.push(i);
            }
            //情况3:大于
            else {
                while (!stack.isEmpty() && (temperatures[i] > temperatures[stack.peek()])) { 
                    int index =  stack.peek();
                    result[index] = i - index;
                    stack.pop();
                }
                stack.push(i);
            }

        }
        return result;
    }
}

双端队列实现:文章来源地址https://www.toymoban.com/news/detail-658241.html

class Solution {
public static int[] dailyTemperatures(int[] temperatures) {
		//单调栈只存放下标
        Deque<Integer> stack = new LinkedList<>();
        int[] result = new int[temperatures.length];
        stack.push(0);

        for (int i = 1; i < temperatures.length; i++) {
            //情况1:小于
            if (temperatures[i] < temperatures[stack.peek()]) { 
                stack.push(i);
            }
            //情况2:等于
            else if (temperatures[i] == temperatures[stack.peek()]){  
                stack.push(i);
            }
            //情况3:大于
            else {
                while (!stack.isEmpty() && (temperatures[i] > temperatures[stack.peek()])) { 
                    int index =  stack.peekFirst();
                    result[index] = i - index;
                    stack.pop();
                }
                stack.push(i);
            }

        }
        return result;
    }
}

到了这里,关于【力扣】739. 每日温度 <单调栈>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • leetcode:每日温度---单调栈

    给定一个整数数组  temperatures  ,表示每天的温度,返回一个数组  answer  ,其中  answer[i]  是指对于第  i  天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用  0  来代替。 示例 1: 示例 2: 示例 3: 提示: 1 = temperatures.length = 105 30 = temperatur

    2024年01月25日
    浏览(44)
  • 代码随想录 739. 每日温度

    题目 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: temperatures 示例 2: 输入: temperatures = [30,40,50,60] 输出: [1,1,1,0] 示例 3: 输入

    2024年01月18日
    浏览(27)
  • 蓝桥杯每日一题----单调栈和单调队列

    单调栈即栈内的元素是单调递减或者单调递增的,我们通过一个题目来理解。 单调栈模板题 题目描述 给出项数为 n 的整数数列 a 1 … a n a_1…a_n a 1 ​ … a n ​ 。 定义函数 f ( i ) f(i) f ( i ) 代表数列中第 i 个元素之后第一个大于 a i a_i a i ​ 的元素的下标,即 f ( i ) = m i n i

    2024年02月19日
    浏览(29)
  • leetcode分类刷题:队列(Queue)(一、单调队列)

    单调队列,看起来是与单调栈对应起来的一样;但是做题的时候感觉单调队列不像单调栈一样,能根据题意自然形成 单调队列的基本实现 ,感觉单调队列更像是和某个队列对应起来的一样 1、 单调队列的经典题型 :使用双向队列维护窗口,窗口移动的元素增删与队列的先进

    2024年02月09日
    浏览(30)
  • 力扣在线OJ——栈和队列

    目录 🍁一、用两个队列实现栈 🌕(一)、题目(力扣链接:用队列实现栈 ) 🌕(二)、注意 🌕(三)、解答 ⭐️1.注意事项 ⭐️2.第一个接口——匿名结构体 ⭐️3.第二个接口——MyStack* myStackCreate() ⭐️4.第三个接口——void myStackPush(MyStack* obj, int x) ⭐️5.第四个接口

    2024年02月07日
    浏览(23)
  • 数据结构:力扣OJ题(每日一练)

    目录 题一:环形链表 思路一: 题二:复制带随机指针的链表  思路一: 本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵! 给定一个链表的头节点   head  ,返回链表开始入环的第一个节点。  如果链表无环,则返回  null 。 如果链表中有某个节

    2024年02月12日
    浏览(34)
  • 数据结构:力扣OJ题(每日一练)

    示例:         初始化: 初始化队列Q1,Q2; 入栈: 先将要入栈的数据放入为空的队列中,都为空时,放入Q1; 出栈: 当要出栈时,将Q1的数据出列n-1个,此时的Q1就是栈要出栈的数据(每次出栈都进行一次第三步将为不为空的队列数据放n-1个到为空队列中)); 获取栈顶元

    2024年02月12日
    浏览(33)
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

    原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len l e n 。 问最少可以拆分成多少个连续子数组,如果不可以,则输出 − 1 -1 − 1 1 ≤ n , l e n ≤ 1 0

    2024年02月06日
    浏览(37)
  • 【LeetCode每日一题】单调栈 402 移掉k位数字

    402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k **位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 : 如果有 m+1 位数字,S1 a 0 a 1 a 2 . . . . a m a_0a_1a_2....a_m a 0 ​ a 1 ​ a 2 ​ .... a m ​ 需要去掉n位数字,

    2024年02月20日
    浏览(25)
  • 数据结构刷题训练:设计循环队列(力扣OJ)

    目录 文章目录 前言 1. 题目:设计循环队列 2. 思路 3. 分析  3.1 定义循环队列  3.2 创建队列  3.3 判空和判满  3.4 入队  3.5 出队  3.6 取队头队尾数据  3.7 销毁队列  4. 题解 总结         当谈到队列数据结构时,很多人可能会想到普通的队列,即先进先出(FIFO)的数据结

    2024年02月13日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包