739. 每日温度

描述

请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。

 

链接

739. 每日温度 - 力扣(LeetCode) (leetcode-cn.com)

 

解法一:暴力

 1 class Solution {
 2     public int[] dailyTemperatures(int[] temperatures) {
 3         if(temperatures.length < 2) {
 4             return new int[0];
 5         }
 6         int[] res = new int[temperatures.length];
 7         for(int i = 0; i < temperatures.length; i++) {
 8             // int left = i;
 9             // int right = i+1;
10                 for(int j =i+1; j< temperatures.length; j++) {
11                     if(temperatures[j] > temperatures[i]) {
12                         res[i] = j-i;
13                         break;
14                     }
15                 }
16             // res[i] = right - left;
17         }
18         return res;
19     }
20 }

 

解法二:用单调栈(思路与上述不大同)

 1 class Solution {
 2       // 总体上是 一种反向的思维,与for..for 在第二个循环的思路 空间上是相反的
 3     public int[] dailyTemperatures(int[] temperatures) {
 4         // 构建一个栈,用来存放每日温度的下标
 5         Stack<Integer> stack = new Stack<>();
 6 
 7         // 构建一个数组,用来保存输出结果
 8         int[] res = new int[temperatures.length];
 9 
10         // 从头开始遍历。思路 不是 for..for中的 以未来与 当下比,而是 以 当下与 过去比
11         for (int i = 0; i < temperatures.length; i++) {
12 
13             // 第一轮,先跳过while,stack存放温度下标
14             // 第二轮,当下的 temperatures[i]是当下,stack.peek()是过去
15             // 结果存放的是 过去 与 现在 温度下标的 差
16             while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
17                 int preIndex = stack.pop(); //stack.pop()保证 while循环中一直删除过去
18                 res[preIndex] = i - preIndex;
19             }
20             // 将每天得温度 入列
21             stack.push(i);
22         }
23         return res;
24     }
25 }

 

题解链接

每日温度( LeetCode 739 )_AlgoMooc算法慕课网

 

posted @ 2021-11-26 22:56  DidUStudy  阅读(89)  评论(0编辑  收藏  举报