LeetCode739. 每日温度 | C语言版
LeetCode739. 每日温度
题目描述
题目地址:739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
解题思路
思路一:使用单调栈
代码实现
C++
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
//使用单调栈来记录右边第一个比当前元素大的元素,优点是只需要遍历一次。
//单调栈里只需要存放元素的下标i就可以了,单调栈里元素顺序为从栈头到栈底的顺序,并且递增
//temperatures(T) = [73,74,75,71,71,72,76,73]
//returnSize = [1,1,4,2,1,1,0,0]
//首先将第一个遍历元素T[0]=73加入单调栈(即添加下标0进栈),并初始化数组returnSize=[0,0,0,0,0,0,0,0]
//接着加入T[1]=74,它大于栈顶元素T[st.top](即T(0)),我们要保持从栈头到栈尾递增的单调栈,所以将T(0)弹出,T(1)加入,同时更新数组returnSize[0]=1-0=1(对于第0天,下一个更高温度出现在1天后)
//同理,加入T(2)=75,T(2)>T(1),T(1)弹出,T(2)加入,更新returnSize[1]=2-1=1
//同理,加入T(3)=71,T(3)!>T(2),T(3)加入
//同理,加入T(4)=71,T(4)!>T(3),T(4)加入
//同理,加入T(5)=72,T(5)>T(4),T(4)弹出,更新returnSize[4]=5-4=1;T[4]弹出后,发现T[5]>T[3],将T[3]继续弹出,记录returnSize[3]=5-3=2;T[3]弹出后,发现T[5]!>T[2],将T[5]加入
//同理,加入T(6)=76,T(6)>T(5),T(5)弹出,T(2)加入,更新returnSize[5]=6-5=1;T[5]弹出后,发现T[6]>T[2],将T[2]继续弹出,更新returnSize[2]=6-2=4
//同理,加入T(7)=73,T(7)!>T(6),T(7)加入
//递减栈
stack<int> st;
//数组
vector<int> returnSize(temperatures.size(),0);
st.push(0);
for(int i=1;i<temperatures.size();i++){
if(temperatures[i]<temperatures[st.top()]){
//T[i]!大于栈顶元素,T[i]加入
st.push(i);
}else if(temperatures[i]==temperatures[st.top()]){
//T[i]!大于栈顶元素,T[i]加入
st.push(i);
}else{
//T[i]大于栈顶元素,栈顶元素弹出,T[i]加入,更新returnSize[i]=i-栈顶元素
while(!st.empty() && temperatures[i]>temperatures[st.top()]){
returnSize[st.top()]=i-st.top();
st.pop();
}
st.push(i);
}
}
return returnSize;
}
};
在这里插入代码片
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片