当前位置: 首页 > news >正文

【Day41 LeetCode】单调栈问题

一、单调栈问题

单调栈问题通常是在一维数组中寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。

1、每日温度 739

这题的目的是对于当天,找到未来温度升高的那一天,也就是当前元素的右边第一个比自己大的元素。所以我们需要维护一个单调栈,栈内元素非严格单调递减。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int>  q;
        vector<int> ans(temperatures.size());
        for(int i=0; i<temperatures.size(); ++i){
            while(!q.empty() && temperatures[q.top()] < temperatures[i]){
                ans[q.top()] = i - q.top();
                q.pop();
            }
            q.push(i);
        }
        return ans;
    }
};

2、下一个更大元素 I 496

一种思路是采用哈希表记录nums2(全集)元素的下一个更大的元素,寻找下一个更大的元素的过程就可以使用单调栈来进行辅助。代码如下:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> mp;
        stack<int> q;
        for(int num : nums2){
            while(!q.empty() && q.top() < num){
                mp[q.top()] = num;
                q.pop();
            }
            q.push(num);
        }
        while(!q.empty()){
            mp[q.top()] = -1;
            q.pop();
        }
        vector<int> ans(nums1.size());
        for(int i=0; i<nums1.size(); ++i)
            ans[i] = mp[nums1[i]];
        return ans;
    }
};

还有一种就是记录nums1(子集)的索引,在循环nums2中采用单调栈,找到元素的下一个更大的元素。

3、下一个更大元素II 503

这题数组可以循环,所以可以理解为有两个数组拼接在一起,求第一个数组的下一个更大元素。一个技巧是在一个数组里遍历两次,这样可以不用将代码扩容,更加简洁方便。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, -1);
        stack<int> q;
        for(int i=0; i<2*n; ++i){
            while(!q.empty() && nums[q.top()] < nums[i%n]){
                ans[q.top()] = nums[i%n];
                q.pop();
            }
            q.push(i%n);
        }
        return ans;
    }
};

相关文章:

  • 什么是中间件中间件有哪些
  • 可解释性:走向透明与可信的人工智能
  • 浅谈线程安全问题的原因和解决方案
  • langchain学习笔记之消息存储在内存中的实现方法
  • Day3 25/2/16 SUN
  • Linux:用 clang 编译带 sched_ext 功能内核
  • 与传统光伏相比 城电科技的光伏太阳花有什么优势?
  • 最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码
  • 利用亚马逊AI代码助手生成、构建和编译一个游戏应用(下)
  • auto关键字的作用
  • Deepseek高效使用指南
  • 每日一题——最长上升子序列与最长回文子串
  • 渗透测试方向的就业前景怎么样?
  • PHP基础部分
  • 人工智能学习(八)之注意力机制原理解析
  • 赖莎莎:创意总监的跨洋之旅
  • 【数据采集】基于Selenium爬取猫眼Top100电影信息
  • 如何搭建Wi-Fi CVE漏洞测试环境:详细步骤与设备配置
  • 第四章 Vue 中的 ajax
  • 基于图像处理的裂缝检测与特征提取
  • 印度宣布即日起对所有巴基斯坦航班关闭领空
  • 马上评|科学谋划“十五五”,坚定不移办好自己的事
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 上海开花区域结果,这项田径大赛为文旅商体展联动提供新样本
  • 王毅:坚持金砖团结合作,改革完善全球治理
  • 论法的精神︱张玉敏:知识产权保护要为社会经济文化发展服务