一.题目要求
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
二.题目难度
中等
三.输入样例
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
四.解题思路
解法1:存每个数的下标,但思路太复杂,让gpt帮我记录一下:
解法2:单调栈,也就是我上面做法的优化
五.代码实现
单调栈
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
stack<int> stk;
vector<int> ans(n);
for(int i = 0; i < n; i++)
{
if(stk.empty())
{
stk.push(i);
}
else
{
while(!stk.empty() && temperatures[i] > temperatures[stk.top()])
{
ans[stk.top()] = i - stk.top();
stk.pop();
}
stk.push(i);
}
}
return ans;
}
};
自己的解法,仅记录
class Solution {
public:
static int cmp(pair<int,int> a, pair<int,int> b)
{
return a.first < b.first;
}
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> stk;
stack<pair<int, int>> count;
vector<pair<int, int>> ans;
for(int i = 0; i < temperatures.size(); i++)
{
if(stk.empty())
{
stk.push(temperatures[i]);
count.push({i, 0});
}
else
{
while(!stk.empty() && temperatures[i] > stk.top())
{
ans.push_back({count.top().first, count.top().second + 1});
int tmp = count.top().second;
count.pop();
if(!count.empty())
count.top().second =count.top().second + tmp + 1;
stk.pop();
}
stk.push(temperatures[i]);
count.push({i, 0});
}
}
while(!count.empty()) {
ans.push_back({count.top().first, 0});
count.pop();
}
sort(ans.begin(), ans.end(), cmp);
vector<int> aans; for(auto v : ans) aans.push_back(v.second);
return aans;
}
};
六.题目总结
判别是否需要使用单调栈,如果需要找到左边或者右边第一个比当前位置的数大或者小,则可以考虑使用单调栈。