算是引出“单调栈”这种数据结构,后面会用这个思想处理下接雨水问题
前言:单调栈模式匹配——题目中提到“求第一个最大/最小的元素”
题型:栈、单调栈、数组
链接:739. 每日温度 - 力扣(LeetCode)
来源:LeetCode
题目描述
给定一个整数数组 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
题目思路
单调栈,对栈内元素有要求的栈:要求栈内元素【从栈顶到栈底】单调递增/递减。这就对入栈元素有了要求。
明确这一点再看题目:不难想到直接暴力法——两个for循环,找到第一个比temperatures[i]的元素temperatures[j],将 j-i 存入到原数组即可。但N^2的时间复杂度一多就超时(而且今天我们要学习新的数据结构)。
如果使用单调栈:那么可以通过判断 temperatures[stack.top()] 和 temperatures[i] 的大小关系决定操作:如果 T[top] 比 T[i] 大或者相等,那就将 i 压入到栈中(这边栈内存的是index)。如果T[i] 更大,那就弹出top,ans[top] = i - top (当然先赋完值再pop)
最终返回 ans 数组即可
C++代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
// 单调栈:求左面/右面 第一个比当前元素大/小的元素
// 保证栈内元素下标:栈顶->栈底是递增的
stack<int> st;
int len = temperatures.size();
vector<int> ans(len,0);
st.push(0); //将index压入栈 比较栈顶元素 和 temperatures[i]的大小
for(int i=1;i<len;i++)
{
// st内存的是index
while(!st.empty()&& temperatures[i] > temperatures[st.top()])
{
ans[st.top()] = i - st.top();
st.pop();
}
if(st.empty() || temperatures[i] <= temperatures[st.top()])
st.push(i);
}
return ans;
}
};