题目描述
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
网址:https://leetcode.cn/problems/daily-temperatures/description
新数据结构学习
单调栈,常用于判断最大最小数
从栈底到栈顶,元素逐渐增大或减小
常用操作:
- 初始化 std::stack<int> stk
- push: stk.push(x)
- pop: stk.pop()
- 索引栈顶元素: stk.top()
- 判断是否为空:stk.empty()
解题思路
从后往前遍历温度数组中的元素,并维护一个单调栈,从栈底到栈顶大小逐渐递减。注意,栈中存的其实是温度对应的下标。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> answers(n,0);
stack<int> mystack;
for(int i = n - 1; i >= 0; i--) { // 从后往前遍历
if(mystack.empty())
mystack.push(i);
// 弹出栈中所有比当前温度小的元素。因为判断的是之后最近的、温度更高的一天,所以比今天的值更小的值就没用了
while(!mystack.empty() && temperatures[mystack.top()] <= temperatures[i]) {
mystack.pop();
}
// 如果栈不为空,证明有后面的某天温度比今天高,算出相差天数
if(!mystack.empty()) {
answers[i] = mystack.top() - i;
}
// 向栈中推入今日温度
mystack.push(i);
}
return answers;
}
};