目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目给我们一个数组,表示每天的温度,要我们返回一个同样长度的数组,答案里装着当前气温的下一个更高气温的距离天数。也就是找到数组中这个数的下一个更大的数,答案填入他们的距离。
那么找到下一个更大或者是更小的值这类题,我们可以使用单调栈来解决。
单调栈顾名思义,是一个栈,不过我们需要维持栈内是单调有序的。
我们把元素依次和栈顶元素对比,如果比栈顶元素更小,我们就接着入栈,直到遇到了比栈顶元素更大的值,我们就将栈顶元素出栈,并且就算是找了第一个比栈顶元素更大的值,这一过程一直重复,直到这个元素小于新的栈顶元素了,我们再接着把这个元素入栈。
这样就保持了栈内有序,并且遍历数组完毕之后,我们也找到了每个数的下一个更大元素。
我们入栈的是数组的下标,这样就可以计算出下一个更大数的距离了,并且我们也可以通过下标来获取到对应的值。
代码:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int>res(temperatures.size(),0); //一律先初始化为0,有更高气温出现再修改
vector<int>stack; //vector模拟栈
for(int i=0;i<temperatures.size();i++){
if(stack.empty()){ //如果栈空直接加入
stack.push_back(i);
}else{
//遇到比栈顶更高的气温,那么更新答案中栈顶气温的下标的值
//因为当前气温可能会比多个之前的气温更高,所以用while
while(!stack.empty()&&temperatures[i]>temperatures[*(stack.end()-1)]){
int last=*(stack.end()-1);
res[last]=i-last;
stack.pop_back();
}
stack.push_back(i);
}
}
return res;
}
};