leetcode 739每日温度,后遍历方法

这段代码实现了一个解决方案,用于根据给定的整数数组T表示的每日气温,计算并返回等待更高温度的天数。算法遍历数组,考虑三种情况:1) 温度递增,2) 温度相等,3) 温度递减。对于递减的情况,它寻找下一个高于当前温度的天数,并计算等待的天数。最后返回结果数组。
摘要由CSDN通过智能技术生成

在这里插入图片描述
从T数组最后往前遍历求res数组的值。
通过分析得到如下结论:
情况1::最简单的一种情况,T[i]<T[i+1],res[i]=1.
情况2:T[i]==T[i+1],此时分为两种情况,如果T[i+1]后没有比他更大的(即res[i+1]==0),那么res[i]=0.如果res[i+1]!=0,那么i+1项经过的天数加一就是结果。
情况三:如果T[i]>T[i+1],首先查看res[i+1]是否为0,为0则res[i]也为0。否则,通过res[i+1]找到下一个比T[i+1]大的数,进行比较,判断是否为0,直到找到比T[i]大的那一项,或者找到了res为0的那一项(此时res[i]=0)。
为了方便查找,设置起始值为i+1的变量s,和T[i]比较的值的下标,通过式子s=res[s]+s迭代。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        vector<int> res;
        int n=T.size();
        res.resize(n);
        res[n-1]=0;
        for(int i=n-2;i>=0;i--){
            if(T[i]>T[i+1]){
                if(res[i+1]==0)
                    res[i]=0;
                else{
                    int s=i+1;
                    while(1){
                        //cout<<"i="<<i<<' '<<"s="<<T[s]<<endl;
                        s=res[s]+s;
                        if(T[i]<T[s])
                        {
                            res[i]=s-i;
                            break;
                        }
                        else if(T[i]==T[s]){
                            if(res[s]==0)
                                res[i]=0;
                            else
                                res[i]=s-i+res[s];
                            break;
                        }
                        else{
                            if(res[s]==0){  
                                res[i]=0;
                                break;
                            }
                        }
                    }
                }
            }
            else if(T[i]==T[i+1]){
                if(res[i+1]==0)
                    res[i]=0;
                else    
                    res[i]=1+res[i+1];
            }
            else    
                res[i]=1;
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值