letcode 739 每日温度

题目 :

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

 分析:

返回的是当天温度后第一次温度上升的天数;

题解1(暴力求解--->双循环)

 代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int len = temperatures.size();
        vector<int> ans(len,0);
        for(int i = 0 ; i <len ;++i){
            for(int j = i+1;j<len;++j){
                if(temperatures[j]>temperatures[i]){
                    ans[i] = j-i;
                    break;
                }
            }
        }
        return ans;
    }
};

题解2 (暴力 回退)

对于温度列表中的每个元素 temperatures[i],需要找到最小的下标 j,使得 i < j 且 temperatures[i] < temperatures[j]。

由于温度范围在 [30, 100] 之内,因此可以维护一个数组 next 记录每个温度第一次出现的下标。数组 next 中的元素初始化为无穷大,在遍历温度列表的过程中更新 next 的值。

 代码 

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int len = temperatures.size();
        vector<int> ans(len),next(101,INT_MAX);
        for(int i = len-1 ; i>=0 ;--i){
            int tmp = INT_MAX;
            for(int t = temperatures[i]+1;t<=100;++t){
                tmp = min(tmp,next[t]);
            }
            if(tmp!=INT_MAX){
                ans[i]=tmp-i;
            }
            next[temperatures[i]]=i;
        }
        return ans;
    }
};

题解三,单调栈

 代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int len = temperatures.size();
        vector<int> ans(len);
        stack<int> s;
        for(int i = 0; i<len;++i){
            while(!s.empty()&&temperatures[i]>temperatures[s.top()]){
                int previousIndex = s.top();
                ans[previousIndex] = i-previousIndex;
                s.pop();
            }
            s.push(i);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_48560325/article/details/127379260
今日推荐