- 方法一
采用暴力法两层循环即可,内层循环用于向后遍历寻找下一个比当前天数(i)温度更高的天数。
class Solution {
public int[] dailyTemperatures(int[] T) {
int len = T.length;
int[] res = new int[len];
for(int i=0; i<len-1; i++){
for(int j=i+1; j<len; j++){
if(T[j] <=T[i]){
continue;
}else{
res[i] = j-i;
break;
}
}
}
return res;
}
}
- 方法二
暴力法的效率较低,可以尝试对其优化,减小内层循环的时间复杂度。
其实我们不用对每一天都使用内层循环向后遍历寻找比它温度高的天数,而是可以先将它保存在栈中继续向后遍历,直到遇到某一天温度比它前一天高,则将栈顶元素(前一天)出栈,并计算天数差保存在答案数组中。由于栈的元素的单调递减的,因此每次有元素出栈都会把栈清空再将新元素入栈。
class Solution {
public int[] dailyTemperatures(int[] T) {
int len = T.length;
if(len<2){
return new int[len];
}
int[] ans = new int[len];
Stack<Integer> st = new Stack<>();
for(int i=0; i<len; i++){
while(!st.empty() && T[st.peek()] < T[i]){
int index = st.pop();
ans[index] = i-index;
}
st.push(i);
}
return ans;
}
}
- 方法三
从后向前遍历,这样就能利用类似动态规划的思想简化遍历过程,第i天的结果仅与第i+1天的结果相关,
当T[i] < T[i+1]时,res[i] =1;
当T[i] >= T[i+1]:
res[i+1]=0,那么res[i]=0;
res[i+1]!=0,那就比较T[i]和T[i+1+res[i+1]](即将第i天的温度与比第i+1天大的那天的温度进行比较)
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
res[T.length - 1] = 0;
for (int i = T.length - 2; i >= 0; i--) {
for (int j = i + 1; j < T.length; j += res[j]) {
if (T[i] < T[j]) {
res[i] = j - i;
break;
} else if (res[j] == 0) {
res[i] = 0;
break;
}
}
}
return res;
}
}