一、题目
1、审题
2、分析
给出一个记录温度的数组。输出当前温度距离下一次升温的下标距离。
二、解答
方法一、
采用一个 dp 数组,从后往前填值。(i < j)
若 dp[i] < dp[j], 则 dp[i] = j - i;
若 dp[i[ >= dp[j] 则 j = j + dp[j]
public int[] dailyTemperatures(int[] T) { int[] dp = new int[T.length]; for (int i = T.length - 2; i >= 0; i--) { for (int j = i + 1; j < dp.length;) { if(T[i] < T[j]) { dp[i] = j - i; break; } else { if(dp[j] == 0) break; j = j + dp[j]; } } } return dp; }
方法二、
采用一个栈来计算下一次的升温距离。从前向后遍历:
public int[] dailyTemperatures2(int[] T) { Stack<Integer> stack = new Stack<>(); int[] ret = new int[T.length]; for (int i = 0; i < ret.length; i++) { while(!stack.isEmpty() && T[i] > T[stack.peek()]) { int idx = stack.pop(); ret[idx] = i - idx; } stack.push(i); } return ret; }