给定一个每日温度的数组,生成一个数组,要求:对于新数组的每个元素,是你需要等待更暖和的天数。如果接下去没有更暖的天了,那就用0替代。
比如,给定数组 temperatures = [73, 74, 75, 71, 69, 72, 76, 73], 你需要输出 [1, 1, 4, 2, 1, 1, 0, 0].原数组第1天是73度,第2天74度是更暖和的一天,所以新数组第1元素就是1.
注: 数组 temperatures 的长度范围: [1, 30000]. 每个温度的范围: [30, 100].
题目:
Given a list of daily temperatures, produce a list that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.
For example, given the list temperatures = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].
Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100].
思路:
想想如果用暴力做的话,肯定超时的,就想着能不能用什么 有序的存放键值对的数据结构,但是好像没有,自己造的话,又很复杂
看别人大佬的思路:发现用栈来做
递减栈Descending Stack
class Solution {
public class Pair{
int key;
int value;
Pair(int key,int value){
this.key = key;
this.value = value;
}
public int getValue() {
return value;
}
public int getKey() {
return key;
}
}
public int[] dailyTemperatures(int[] T) {
int n = T.length;
Stack<Pair> st = new Stack<Pair>();
int [] res = new int[n];
res[n-1] = 0;
for(int i = 0;i<n;i++){
//第一步:先判断可以不可以出栈
while (!st.empty()){
//如果比栈顶大,就出栈,并在相应位置附上值
if(T[i] > st.peek().getKey()){
int weizhi = st.peek().getValue();
res[weizhi] = i-weizhi;
st.pop();
}else break;
}
//第二步:判断当前元素是否要入栈
if(i+1>n && T[i]<T[i+1]) res[i] = 1;
else {
//入栈
st.push(new Pair(T[i],i));
}
}
//最后把栈里的元素都出栈,并赋值为0
while (!st.empty()){
res[st.pop().getValue()] = 0;
}
return res;
}
}