力扣算法刷题 Day 48(单调栈)

算法基础

单调栈:栈顶到栈底保持递增或递减的一个栈,通常用于一维数组,找到右边第一个满足特征的值之类的

739 每日温度

题目链接

添加链接描述

思路

首先想到双重循环遍历。优化:需要记录遍历过程中第一个更大的数。因此使用单调栈。

操作过程:首元素入栈->下一个元素判定-> 当前遍历元素大于栈顶元素 ? 是:栈顶元素出栈,记录,当前元素入栈; 否:当前元素入栈

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> answer(temperatures.size(),0);
        stack<int> st;
        if(temperatures.size() == 0){
            return answer;
        }
        st.push(0);
        for(int i = 1; i < temperatures.size(); i++)
        {
            if(temperatures[i] <= temperatures[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty() && temperatures[st.top()] < temperatures[i]) //注意加判断st为空
                {
                    answer[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return answer;
        
    }
};

496 下一个更大元素

题目链接

添加链接描述

思路

根据nums2 来维护单调栈,根据nums1建立一个map便于查询。

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> result(nums1.size(), -1);
        if (nums1.size() == 0) return result;

        unordered_map<int, int> umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);
        for (int i = 1; i < nums2.size(); i++) {
            while (!st.empty() && nums2[i] > nums2[st.top()]) {
                if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
                    int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
                    result[index] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }
        return result;
    }
};

503 下一个更大元素II

题目链接

添加链接描述

cpp 复制代码
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> result(nums.size(), -1);
        if (nums.size() == 0) return result;
        stack<int> st;
        st.push(0);
        for (int i = 1; i < nums.size() * 2; i++) { 
            // 模拟遍历两边nums,注意一下都是用i % nums.size()来操作
            if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());
            else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size()); 
            else {
                while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
                    result[st.top()] = nums[i % nums.size()];
                    st.pop();
                }
                st.push(i % nums.size());
            }
        }
        return result;
    }
};
相关推荐
宵时待雨6 分钟前
回溯算法专题1:递归
数据结构·c++·笔记·算法·leetcode·深度优先
爱思德学术10 分钟前
【SPIE出版】黄冈师范学院主办!第四届大数据、计算智能与应用国际会议(BDCIA 2026)
大数据·算法·数据分析·云计算·etl
洛水水10 分钟前
【力扣100题】40.二叉树中的最大路径和
算法·leetcode·深度优先
洛水水14 分钟前
【力扣100题】37.从前序与中序遍历序列构造二叉树
c++·算法·leetcode
zyq99101_116 分钟前
递归与动态规划实战代码解析
python·算法·蓝桥杯
一只机电自动化菜鸟25 分钟前
一建机电备考笔记(34)焊接技术(设备与材料1)(含考频+题型)
笔记·学习·职场和发展·生活·学习方法
橘白31637 分钟前
rl笔记(一):策略梯度更新算法推导
人工智能·算法·机器人·强化学习
hhhhhaaa38 分钟前
多节点矩阵式任务系统:统一配置中心与动态规则引擎架构设计
后端·算法·架构
吃着火锅x唱着歌1 小时前
LeetCode 739.每日温度
算法·leetcode·职场和发展
如竟没有火炬1 小时前
去除重复字母——贪心+单调栈
开发语言·数据结构·python·算法·leetcode·深度优先