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].

给定数组, 找出每个元素后面最近的比他大的数, 暴力解法当然可破.研究一下最优解

使用栈,第一个元素先入栈, 后面遍历每个元素时,先看栈顶元素是否符合, num[i]>stack.top(), 若符合我们就知道栈顶元素对应原数组的索引,把对应的结果填上.

那么这里为什么只用判断栈顶元素呢? 好像应该把栈遍历一遍对不对. 其实不用. 因为栈的元素一定是从大到小排序的.

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        vector<int> res(T.size(),0),st;
        for(int i=0;i<T.size();++i)
        {
            while(!st.empty()&&T[i]>T[st.back()])
            {
                res[st.back()]=i-st.back();
                st.pop_back();
            }
            st.push_back(i);
        }
        return res;
    }
};

由于栈的入栈和出栈实际上有拷贝元素的问题, 使用数组+索引可以稍微更快点.

这里测试c++版本好像也没有快多少, 200ms和180ms的区别,不知道为何原答案Java版本差了那么多

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        vector<int> res(T.size(),0),st(T.size());
        int idx=-1;
        for(int i=0;i<T.size();++i)
        {
            while(idx>-1&&T[i]>T[st[idx]])
            {
                res[st[idx]]=i-st[idx];
                --idx;
            }
            st[++idx]=i;
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/lychnis/p/12031852.html