二刷代码随想录——单调栈day58

news/2024/7/7 21:32:26

文章目录

  • 前言
    • 单调栈知识点
  • 单调栈的特点
  • 一、739. 每日温度
  • 二、496. 下一个更大元素 I
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!
二刷决定精刷了,于是参加了卡子哥的刷题班,训练营为期60天,我一定能坚持下去,迎来两个月后的脱变的,加油!
推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录

单调栈知识点

代码随想录二刷即将结束,但是刷题大业仍未止。

单调栈是一种特殊的数据结构,它遵循单调性原则,即栈内元素要么单调递增,要么单调递减。单调栈的作用在于解决一些特定的问题,如找到一个元素在其序列中左边或右边第一个比其大或小的元素,或者用于解决一些编程竞赛中的题目。

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

单调栈的特点

单调栈的特点是,在维护栈的时候,如果要入栈的元素比栈顶元素大(对于单调递减栈)或小(对于单调递增栈),则将栈顶元素出栈,直到栈顶元素小于(对于单调递减栈)或大于(对于单调递增栈)当前要入栈的元素,然后将元素入栈。这个过程需要遍历一遍元素,因此时间复杂度为O(n)。

在使用单调栈的时候首先要明确如下几点:

单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。

单调栈里元素是递增呢? 还是递减呢?

一、739. 每日温度

739. 每日温度
Note:控制实行单调栈

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        //递增栈
        stack<int> st;

        vector<int> result(temperatures.size(), 0);
        st.push(0);

        for (int i = 1; i < temperatures.size(); i++) {
            if (temperatures[i] < temperatures[st.top()])
                st.push(i);
            else if (temperatures[i] == temperatures[st.top()])
                st.push(i);
            else {
                while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                    result[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

二、496. 下一个更大元素 I

496. 下一个更大元素 I

Note:与上一题类似,都是单调栈解决问题

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;
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);

        for (int i = 1; i < nums2.size(); i++) {
            if (nums2[i] < nums2[st.top()])
                st.push(i);
            else if (nums2[i] == nums2[st.top()])
                st.push(i);
            else {
                while (!st.empty() && nums2[i] > nums2[st.top()]) {
                    if (umap.count(nums2[st.top()]) > 0) {
                        int index = umap[nums2[st.top()]];
                        result[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

总结

单调栈的实现可以基于数组,也可以基于链表,具体取决于问题的需求和上下文。在实现时,可以选择将元素值或元素的位置下标入栈,这取决于问题是否需要找到元素的位置信息。


http://lihuaxi.xjx100.cn/news/2122483.html

相关文章

【Java程序设计】【C00372】基于(JavaWeb)Springboot的社区网格化管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一&#xff1a;jq 的ajax&#xff08;在 vue 中不推荐同时使用&#xff09;方案二&#xff1a;js 原始官方 fetch方法方案三&#xff1a;axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

小红书矩阵批量发布工具,一键发布笔记软件

昨日&#xff0c;我收到了一条充满渴望与期待的私信&#xff0c;来自一位小红书的矩阵账号博主。他手握多个账号&#xff0c;渴望寻找一款能够助力他批量发布笔记的神器&#xff0c;每日能够轻松达到百篇的发布量。这份迫切的需求&#xff0c;我深感体会&#xff0c;因为这正是…

【链表】Leetcode 146. LRU 缓存【中等】

LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…

再次度过我的创作纪念日

机缘 写博客的机缘巧合已经在上一篇博客中写到了&#xff0c;至于收获和成就也不一一赘述了。想和大家聊的呢就这最近这一年左右的经历吧 日常 自从2022年开始&#xff0c;入职了一家大型的项目外派公司&#xff0c;名字就不说了。开始了我的保险公司系统的开发工作。工作地点…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题&#xff1a; Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者&#xff1a; Yile Chen&#xff08;陈亦乐&#xff09; ; Xiucheng Li&#xff08;李修成&#xff09;; Gao Cong&#xff08;丛高&#xff09; ; Zhifeng Ba…

数据库SQLSever——数据查询

一、无条件查询 查询表的所有信息 SELECT * FROM 表名 例&#xff1a;查询学生表 SELECT * FROM student087 二、根据列名查询 根据列名查询表信息 SELECT [列名],[列名],.... FROM 表名 例&#xff1a;查询学生表的学生学号和姓名 SELECT SNO&#xff0c;SNAME FROM STU…

水泵干转检测

水泵干转检测是指在水泵工作时&#xff0c;监测水泵的运行状态&#xff0c;以便及时发现水泵出现干转&#xff08;也称为空转&#xff09;的情况。水泵干转是指水泵在没有输送液体的情况下运行&#xff0c;这可能会导致水泵叶轮、机械密封等部件损坏&#xff0c;甚至引起火灾等…