hot100-每日温度
739. 每日温度 - 力扣(LeetCode)
自己用的双指针,但是超时了,本题的知识点是单调栈
怎么理解单调栈的这个过程,当然,这个单调可以是单调递增,也可以是单调递减。压栈的逻辑是这样的,如果当前访问到的元素比栈顶小或者相等,就压入栈中。一直这样那么向栈底的方向就是递增的。如果当前访问到的元素大于栈顶,二者索引相减就是答案,并弹出栈顶,把这元素的索引再压进去。比如访问到721时,那么栈的元素(其实应该是索引,跳过从开始的过程)应该是
69->71->75(栈底),下一个访问大72时,72大于69,就可以直接相减弹出69,变成71->75,然后72大于71,相减弹出71,71小于75,变成71->75,访问大76的时候,就可以把75弹出了。
个人理解逻辑:那75举例子,它后面的元素都比他小,所以都不符合题目的要求,那么就继续访问,当访问到一个比较大的时候,就对栈顶进行处理,符合就弹出就继续处理,直到75成为栈顶的时候,说明它后面的元素(访问过的都不符合)都已经干掉了,保证下一个访问的元素一定比75成为栈顶之前时75前面的元素大(实际上就是对他们处理了),并可能小于等于大于75,如果大于,那么就是第一次出现比他它的(因为比他小就压入),因为再比他大的数字第二次出现之前就已经把75弹走了。
class Solution {
public:vector<int> dailyTemperatures(vector<int>& T) {// 递增栈stack<int> st;vector<int> result(T.size(), 0);st.push(0);for (int i = 1; i < T.size(); i++) {if (T[i] < T[st.top()]) { // 情况一st.push(i);} else if (T[i] == T[st.top()]) { // 情况二st.push(i);} else {while (!st.empty() && T[i] > T[st.top()]) { // 情况三result[st.top()] = i - st.top();st.pop();}st.push(i);}}return result;}
};