【LeetCode刷题笔记(六十七)】之 739 每日温度

骑猪看日落 2023-10-07 15:22 68阅读 0赞

本文章由公号【开发小鸽】发布!欢迎关注!!!

老规矩–妹妹镇楼:

20200721223424816.JPG

一. 题目

(一) 题干

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

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

二. 题解

(一) 思路

这个题目用暴力解法可以很容易实现,直接遍历每个数,查找大于它的第一个数即可。可是这样的时间复杂度非常高,我们需要找个更加的做法。这里使用单调栈的做法,从名字就可以看出来,栈中的数字的排序是单调的。本题中寻找的是每个数后面更大的那个数,因此每次入栈的一定是小于等于当前栈顶的数。遍历每个数,如果当前栈非空且当前的数大于栈顶的数,说明该数一定是第一个大于栈顶元素的数,直接求出二者的下标差。若当前的数小于或等于栈顶元素,则入栈,这样可以保持单调栈。

(二) 代码

Java:

  1. 暴力解法:

    class Solution {

    1. public int[] dailyTemperatures(int[] T) {
    2. if(T == null || T.length == 0){
    3. return new int[0];
    4. }
    5. //暴力解法
    6. int n = T.length;
    7. for(int i = 0; i < n; ++i){
    8. if(i == n-1){
    9. T[i] = 0;
    10. break;
    11. }
    12. for(int j = i+1; j < n; ++j){
    13. if(T[i] < T[j]){
    14. T[i] = j-i;
    15. break;
    16. }
    17. if(j==n-1 && T[i] >= T[j]){
    18. T[i] = 0;
    19. }
    20. }
    21. }
    22. return T;
    23. }

    }

  1. 单调栈:

    class Solution {

    1. public int[] dailyTemperatures(int[] T) {
    2. if(T == null || T.length == 0){
    3. return new int[0];
    4. }
    5. // 单调栈
    6. int n = T.length;
    7. int[] out = new int[n];
    8. LinkedList<Integer> stack = new LinkedList<>();
    9. for(int i = 0; i < n; ++i){
    10. while(!stack.isEmpty() && T[i] > T[stack.getLast()]){
    11. int t = stack.removeLast();
    12. out[t] = i- t;
    13. }
    14. stack.addLast(i);
    15. }
    16. return out;
    17. }

    }

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode739. 每日温度

    给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer\[i\] 是指对于第 i 天,下一个更高温度出现在几天后。如果气

    相关 LeetCode 739每日温度

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

    相关 LeetCode-739. 每日温度

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