要求
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
思路
方法一:暴力解(超时)
遍历每一个元素,然后再从当前元素往后找比它大的,找到之后记录下他俩位置的差值,然后停止内层循环,如果没找到默认为0。
public int[] dailyTemperatures(int[] T) {
int length = T.length;
int[] res = new int[length];
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if (T[j] > T[i]) {
res[i] = j - i;
break;
}
}
}
return res;
}
方法二:栈
栈中存放的是数组元素的下标,元素入栈,遇到比栈顶元素大的数则栈顶元素出栈,当前元素下标减去出栈元素下标
public int[] dailyTemperatures(int[] T) {
Stack<Integer> stack = new Stack<>();
int[] ret = new int[T.length];
for (int i = 0; i < T.length; i++) {
while (!stack.isEmpty() && T[i] > T[stack.peek()]) {
int idx = stack.pop();
ret[idx] = i - idx;
}
stack.push(i);
}
return ret;
}
方法三:做右往左遍历
public class LeetCode739 {
public int[] dailyTemperatures(int[] temperatures) {
int[] res = new int[temperatures.length];
//从右往左查找
for (int i = res.length - 1; i >= 0; i--) {
int j = i + 1;
while (j < res.length){
//后面的温度比前面温度高,说明找到,温度高的下标-温度低的下标
if (temperatures[j] > temperatures[i]){
res[i] = j - i;
break;
}else if(res[j] == 0){
//如果没找到,并且res[j] == 0说明 j元素后面没有值了;
// 说明没有比当前 i元素的值大的元素了,直接结束循环
break;
}else {
//说明res[j] != 0,那么就是第 j个元素后面有比当前 j元素值大的元素
//我们让 j下标挪res[j]个单位,找到那个值,在和第 i个元素进行比较
j += res[j];
}
}
}
return res;
}
}