739. Daily Temperatures

Given a list of daily temperatures T, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.

For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].

Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100].

题意:给出一个数组,对于数组中的每个元素,计算其右边第一个比它大的元素与它的位置之差。

方法一:维护一个栈,栈中记录的是位置信息,表示该位置对应的数组元素还未找到下一个比其大的元素。当栈不为空或者栈顶元素所表示的位置处元素值小于当前遍历的数组元素时,表示栈顶元素找到其下一个较大值,退栈并记录。每次遍历不要忘记将当前位置入栈。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        stack<int>st;
        vector<int>vec(T.size(),0);
        for(int i=0;i<T.size();i++){
            while(!st.empty()&&(T[st.top()]<T[i])){
                vec[st.top()]=i-st.top();
                st.pop();
            }
            st.push(i);
        }
        return vec;
    }
};

方法二:从后向前遍历数组,vec[i]记录第i位置处元素与下一个大于它的元素的位置之差,则有[i+1,i+vec[i]]位置处的元素均不大于i位置元素。对每一元素T[i],若其后面相邻元素T[j]大于它,则距离差为1;否则有[j,j+vec[j]]区间内元素必均不大于T[i],我们直接从T[j+vec[j]]再开始比较即可。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
         vector<int>vec(T.size(),0);
         for(int i=T.size()-1;i>=0;i--){
            int j=i+1;
            while(j<T.size()&&T[i]>=T[j]){
                if(vec[j]>0)
                   j+=vec[j];
                else 
                    j=T.size();
            }
            if(j<T.size()) 
                vec[i]=j-i;
         }
         return vec;
    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值