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 Stackstack = 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算法慕课网