稀碎从零算法笔记Day32-LeetCode:每日温度

发布于:2024-03-29 ⋅ 阅读:(22) ⋅ 点赞:(0)

算是引出“单调栈”这种数据结构,后面会用这个思想处理下接雨水问题

前言:单调栈模式匹配——题目中提到“求第一个最大/最小的元素”

题型:栈、单调栈、数组

链接:739. 每日温度 - 力扣(LeetCode)

来源:LeetCode

题目描述

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

题目样例

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

题目思路

单调栈,对栈内元素有要求的栈:要求栈内元素【从栈顶到栈底】单调递增/递减。这就对入栈元素有了要求。

明确这一点再看题目:不难想到直接暴力法——两个for循环,找到第一个比temperatures[i]的元素temperatures[j],将 j-i 存入到原数组即可。但N^2的时间复杂度一多就超时(而且今天我们要学习新的数据结构)。

如果使用单调栈:那么可以通过判断 temperatures[stack.top()] 和 temperatures[i] 的大小关系决定操作:如果 T[top] 比 T[i] 大或者相等,那就将 i 压入到栈中(这边栈内存的是index)。如果T[i] 更大,那就弹出top,ans[top] = i - top (当然先赋完值再pop) 

最终返回 ans 数组即可

C++代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        // 单调栈:求左面/右面 第一个比当前元素大/小的元素
        // 保证栈内元素下标:栈顶->栈底是递增的
        stack<int> st;
        int len =  temperatures.size();
        vector<int> ans(len,0);
        st.push(0); //将index压入栈 比较栈顶元素 和 temperatures[i]的大小
        for(int i=1;i<len;i++)
        {
            // st内存的是index
            while(!st.empty()&& temperatures[i] > temperatures[st.top()])
            {
                ans[st.top()] = i - st.top();
                st.pop();
            }
            if(st.empty() || temperatures[i] <= temperatures[st.top()])
                st.push(i);
        }
        return ans;
    }
};

结算页面

本文含有隐藏内容,请 开通VIP 后查看