题目

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

示例 1:

  1. 输入: temperatures = [73,74,75,71,69,72,76,73]
  2. 输出: [1,1,4,2,1,1,0,0]

示例 2:

  1. 输入: temperatures = [30,40,50,60]
  2. 输出: [1,1,1,0]

示例 3:

  1. 输入: temperatures = [30,60,90]
  2. 输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 10^5
  • 30 <= temperatures[i] <= 100

    解题方法

    单调栈

    单调栈通常是一维数组,用于寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置
    正向遍历,使用递增单调栈保存未处理的元素,在弹出时进行处理。
    时间复杂度O(n),空间复杂度O(n)
    C++代码:
    1. class Solution {
    2. public:
    3. vector<int> dailyTemperatures(vector<int>& temperatures) {
    4. stack<int> next;
    5. vector<int> result(temperatures.size(), 0);
    6. for(int i=0; i<temperatures.size(); i++) {
    7. while(!next.empty() && temperatures[i]>temperatures[next.top()]) {
    8. result[next.top()] = i-next.top();
    9. next.pop();
    10. }
    11. next.push(i);
    12. }
    13. return result;
    14. }
    15. };
    反向遍历,使用递减单调栈保存处理过的元素,在入栈时处理。
    C++代码:
    1. class Solution {
    2. public:
    3. vector<int> dailyTemperatures(vector<int>& temperatures) {
    4. int size = temperatures.size();
    5. stack<int> next;
    6. vector<int> result(size, 0);
    7. for(int i=size-1; i>=0; i--) {
    8. while(!next.empty() && temperatures[i]>=temperatures[next.top()]) next.pop();
    9. if(!next.empty()) {
    10. result[i] = next.top()-i;
    11. }
    12. next.push(i);
    13. }
    14. return result;
    15. }
    16. };