题目分析
-
相当于寻找右边第一个比它大的位置,维持一个递减栈,存放索引
-
输出链表中有几个位置的值已经知道:
-
最右边第一个一定为0,从这就可以看出类似dp,因为温度不会再变化
-
所以可以直接从倒数第二个开始,记录当前和它的右边
-
当前温度<右边温度 天数=索引位置的差值 当前 = 右边 (把当前看成右边位置处理) 1)当右边记录天数为0,那么证明不会有升温;2)右边≠0,那么就等于 右边+ 1 即(j - i),其实和下面2)是一样的 当前>右边 1)当右边记录天数为0,那么证明一定不可能再超过当前;2)右边≠0,转到 j 记录的位置,再继续判断
-
Solution
递减栈
public int[] dailyTemperatures2(int[] T) {
if (T == null || T.length == 0) return null;
int[] result = new int[T.length];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < T.length; i++) {
// 这里应该要写大于,不要写大于等于
while (!stack.isEmpty() && T[i] > T[stack.peek()]) {
result[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);
}
return result;
}
dp
public int[] dailyTemperatures(int[] T) {
if (T == null || T.length == 0) return null;
int[] values = new int[T.length];
for (int i = T.length - 2; i >= 0; i--) {
int j = i + 1;
while (true) {
if (T[i] < T[j]) {
values[i] = j - i;
break;
} else if (values[j] == 0) {
values[i] = 0;
break;
}
// 当T[i] == T[j]的时候,转到j记录的位置继续判断
j = j + values[j];
}
}
return values;
}
Reference:小码哥MJ