LeetCode739. 每日温度 | C++语言版

LeetCode739. 每日温度

类似于42.接雨水

题目描述

题目地址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;
    }
};
在这里插入代码片
运行结果

在这里插入图片描述

参考文章:

https://leetcode.cn/problems/daily-temperatures/solutions/890070/dai-ma-sui-xiang-lu-dai-ni-xue-tou-dan-d-kwbv/?q=%E4%BB%A3%E7%A0%81%E9%9A%8F%E6%83%B3%E5%BD%95&orderBy=most_relevant

思路二:减少遍历节点数
代码实现
在这里插入代码片
运行结果
参考文章:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李莲花*

多谢多谢,来自一名大学生的感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值