题意

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。

思路

利用栈来对数组下标做操作,开一个和数组同样大小的数组,并且值都设为0,遍历原数组,如果栈为空,或者栈顶元素(下标)对应的值大于当前元素,(不是栈顶对应元素的下一个最大值,所以整体上是维持了一个递减栈)就将元素下标入栈,如果栈顶元素(下标)对应的值小于当前元素,那么当前元素肯定是第一个比它大的元素,这样就利用栈找到了下一个比它大的元素,按照题意记录结果即可。

代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        int len=T.size();
        vector<int> ans(len,0);
        stack<int> st;   //为啥总是忘记设置stack
        for(int i=0;i<len;i++){
            while(!st.empty() && T[st.top()]<T[i]){
                //当栈不为空并且比栈顶元素大的时候,弹出栈顶元素,记录下标差
                int temp=st.top();
                st.pop();
                ans[temp]=i-temp;
            }
            //直到不满足上述条件,st为空,或者直到遇到比自己大的元素,入栈
            st.push(i);
        }
        return ans; //开始的时候初始化为0,所以后面栈里的剩余元素还是0
    }
};