题目描述:

传送门-力扣
请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

思路

  1. 暴力
    毫无疑问,中等难度用暴力肯定超时。
  2. 自己的思路-小顶堆
    想要进行一次遍历,肯定需要将“已经走过但没有找到比它高的温度”进行保存,同时走到下一个温度值时,需要将该温度和已经保存的温度进行比较,如果当前温度比保存的温度中某个大,就需要将这个保存的温度弹出并计算天数。当时想的是把走过的温度和当前位置的温度保存在容器里并进行一个排序,把最小的温度放在上面,如果栈顶温度和当前位置的温度相同,则继续向后遍历;当栈顶温度和当前温度不同,说明当前温度比容器中某个位置的温度要高,就用当前位置减去栈顶温度对应的位置,就得到栈顶温度位置处需要填写的天数,然后继续比较当前位置温度和栈顶温度……因为保存的是温度但是要计算天数,所以用pair保存了<温度、位置>对,然后第一个想到的就是小顶堆,写了程序后,果然过了,但是两个都只击败了个位数的人。。。。。
    class Solution {
    public:
     vector<int> dailyTemperatures(vector<int>& T) {
         priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> sheap;
         vector<int> res(T.size(), 0);
         for(int i  = 0; i < T.size(); i++)
         {
             sheap.push(make_pair(T[i], i));
             while(!sheap.empty() && sheap.top().first != T[i])
             {
                 res[sheap.top().second] = i - sheap.top().second;
                 sheap.pop();
             }
         }
         return res;
     }   
    };
  3. 单调栈
    看了题解,才发现自己的思路是对的,但是选错了容器。
    用栈的话,走到下一个温度时,栈为空就直接放到栈里,不为空先和栈顶元素进行比较,如果比栈顶元素小,再放到栈顶,比栈顶元素大,就弹出栈顶元素,再继续和栈顶元素比较,这样的操作其实已经保证了我栈里的元素从栈底到栈顶是单调递减的了,不需要再进行额外的排序。
    小彩蛋:先将返回数组初始化为全0,这样一遍遍历后,不需要对没有比该位置温度大的位置进行处理。
    class Solution {
    public:
     vector<int> dailyTemperatures(vector<int>& T) {
         stack<int> stk;
         vector<int> res(T.size(), 0);
         for(int i  = 0; i < T.size(); i++)
         {
              while(!stk.empty() && T[stk.top()] < T[i])
              {
                  res[stk.top()] = i - stk.top();
                  stk.pop();
              }
              stk.push(i);  
         }
         return res;
     }   
    };