739. 每日温度
该问题本质上是找下一个比当前数更大的数的下标,最后所求的数组记录的即为下标差。一开始做这题的时候,我一直关注着具体数值,导致一直不知道从哪入手。
方法一:
用栈记录下标,如果当前数<栈顶数,入栈,当前数>栈顶数,出栈,出栈的数与当前数的下标差即为出栈数的res值
Java
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<Integer> st = new Stack<>();
for(int i = 0; i < T.length;i++){
while(!st.isEmpty()&&T[i] > T[st.peek()]){
int temp = st.pop();
res[temp] = i - temp;
}
st.push(i);
}
return res;
}
}
方法二:
所求的数组类似于kmp算法的next数组,从后往前遍历T数组,res数组记录比该数大的数所在的相对位置。
Java
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;
}