LeetCode 739. 每日温度

Posted hurryxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 739. 每日温度相关的知识,希望对你有一定的参考价值。

1. 问题描述

(LeetCode 739. 每日温度)[https://leetcode-cn.com/problems/daily-temperatures/]

2. 问题分类

  • 栈(单调栈)

3. 问题解析

Reference: https://leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode/

  • 假设T[0]=10; T[10]=20; T[20]=20;T[20]不会T[0]答案
  • 假设T[0]=10; T[10]=10; T[20]=20;T[20]可能T[0]答案

3.1 算法思想

  1. 从数组末尾依次遍历至数组首部,维护一个单调栈(存储数组元素下标)
  2. !st.empty()&&T[i]>=T[stack.top()],则一直执行pop(),此处必须是>=,因为温度相等不能算提升,因此需要pop()
  3. 若栈为空则为0,否则为stack.top()-i
  4. 将新的数组下标入栈

3.2 举个栗子

t=[73,74,75,71,69,72,76,73]

  1. i = 7ans[i] = 0,stack = [7 (73)]
  2. i = 6pop(), ans[i] = 0, stack = [6 (76)]
  3. i = 5ans[i] = 1, stack = [5 (72), 6 (76)]
  4. i = 4ans[i] = 1, stack = [4 (69), 5 (72), 6 (76)]
  5. i = 3pop(),ans[i] = 2, stack = [3 (71), 5 (72), 6 (76)]
    ……

4. 算法实现

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        if(T.empty())   return {};
        stack<int> st;
        vector<int> res(T.size(),0);
        for(int i=T.size()-1;i>=0;i--)
        {
            while(!st.empty()&&T[st.top()]<=T[i])    st.pop();
            res[i]=st.empty()?0:st.top()-i;
            st.push(i);
        }
        return res;
    }
};

以上是关于LeetCode 739. 每日温度的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-739.每日温度(双思路分析)

leetcode-739. 每日温度

LeetCode | 739.每日温度

LeetCode实现20 有效的括号,739每日的温度

LeetCode 739 每日温度

leetcode - 739每日温度 - 单调栈