代码随想录笔记--单调栈篇

news2025/1/10 11:37:27

1--单调栈

        使用单调栈的特征:寻找第一个比当前元素大或者小的元素。

2--每日温度

主要思路:

        基于单调栈,单调栈从栈顶开始递增;单调栈存储的是元素对应的索引。

        当遇到一个元素大于栈顶元素i时,计算 answer[i]。

#include <iostream>
#include <vector>
#include <stack>

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

int main(int argc, char* argv[]){
    // temperatures = [73,74,75,71,69,72,76,73]
    std::vector<int> test = {73, 74, 75, 71, 69, 72, 76, 73};
    Solution S1;
    std::vector<int> res = S1.dailyTemperatures(test);
    for(auto num : res) std::cout << num << " ";
    std::cout << std::endl;
    return 0;
}

3--下一个更大元素I

主要思路:

        基于单调栈和哈希表。

        将 nums1 的元素映射为哈希表,其中 key 为 num1[i],val 为 i;

        遍历 nums2 构建单调栈,当 nums2[i] > stk.top() 时,且 stk.top() 属于 nums1,表明找到第一个比它大的元素,则根据hash_map[stk.top()]可以知道其在nums1的位置,记录结果res[hash_map[stk.top()]] = nums2[i] 即可。

#include <iostream>
#include <vector>
#include <stack>
#include <unordered_map>

class Solution {
public:
    std::vector<int> nextGreaterElement(std::vector<int>& nums1, std::vector<int>& nums2) {
        std::vector<int> res(nums1.size(), -1);
        if(nums1.size() == 0) return res;
        std::unordered_map<int, int>hash_map;
        for(int i = 0; i < nums1.size(); i++) hash_map.emplace(nums1[i], i); // 存储值,索引

        std::stack<int> stk;
        for(int i = 0; i < nums2.size(); i++){
            while(!stk.empty() && nums2[i] > stk.top()){
                if(hash_map.find(stk.top()) != hash_map.end()){
                    res[hash_map[stk.top()]] = nums2[i];
                }
                stk.pop();
            }
            stk.push(nums2[i]);
        }
        return res;
    }
};

int main(int argc, char* argv[]){
    // nums1 = [4,1,2], nums2 = [1,3,4,2]
    std::vector<int> test1 = {4, 1, 2};
    std::vector<int> test2 = {1, 3, 4, 2};
    Solution S1;
    std::vector<int> res = S1.nextGreaterElement(test1, test2);
    for(auto num : res) std::cout << num << " ";
    std::cout << std::endl;
    return 0;
}

3--下一个更大元素II

主要思路:

        基于单调栈,本题的难点是针对一个循环数组,可以通过取模的操作来模拟循环数组。

#include <iostream>
#include <vector>
#include <stack>

class Solution {
public:
    std::vector<int> nextGreaterElements(std::vector<int>& nums) {
        std::vector<int> res(nums.size(), -1);
        std::stack<int> stk;
        for(int i = 0; i < 2*nums.size(); i++){
            // 通过取模操作模拟有环的过程
            int idx = i % nums.size();
            while(!stk.empty() && nums[idx] > nums[stk.top()]){
                res[stk.top()] = nums[idx];
                stk.pop();
            }
            stk.push(idx);
        }
        return res;
    }
};

int main(int argc, char* argv[]){
    // nums = [1, 2, 1]
    std::vector<int> test = {1, 2, 1};
    Solution S1;
    std::vector<int> res = S1.nextGreaterElements(test);
    for(int num : res) std::cout << num << " ";
    std::cout << std::endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯待办关停之后还能用吗?可替代的待办提醒APP

如果你之前喜欢用“腾讯待办”这款微信小程序设置待办提醒&#xff0c;那么接下来不得不面对一个事实&#xff1a;腾讯待办将于2023年的12月20日全面停止运营并下架。如果在这款小程序中记录了很多的待办事项&#xff0c;现在应该尽快导出数据&#xff0c;避免数据丢失。 还有…

Rowset Class

Rowset类在PeopleCode中非常常见&#xff0c;以下将Rowset翻译成行集&#xff0c;顾名思义&#xff0c;行的集合 目录 Understanding Rowset Class Shortcut Considerations Data Type of a Rowset Object Scope of a Rowset Object Rowset Class Built-In Functions Row…

CUDA学习笔记(十二) CUDA库简介

CUDA Libraries简介 上图是CUDA 库的位置&#xff0c;本文简要介绍cuSPARSE、cuBLAS、cuFFT和cuRAND&#xff0c;之后会介绍OpenACC。 cuSPARSE线性代数库&#xff0c;主要针对稀疏矩阵之类的。cuBLAS是CUDA标准的线代库&#xff0c;不过没有专门针对稀疏矩阵的操作。cuFFT傅里…

YOLOv5算法改进(20)— 如何去写YOLOv5相关的论文(包括论文阅读+规律总结+写作方法)

前言:Hello大家好,我是小哥谈。最近一直在阅读关于YOLOv5的相关论文,读着读着我发现一条可以发论文的规律,特此简单总结一下,希望能够对同学们有所启迪!🌈 前期回顾: YOLOv5算法改进(1)— 如何去改进YOLOv5算法

CanIf Transmit Buffering 机制说明

目录 前言未使能场景的报文发送机制使能场景的报文发送机制如何配置前言 在AUTOSAR CanIf 中,提供了发送的Buffering机制 。对于一个报文来说,Buffering起始于CanIf_Transmit,结束于CanIf_TxConfirmation 。 主要应用与一个MailBox 发送多个报文的场景,用于解决因为硬件发…

scp通过跳板机向服务器传文件的方法

scp上传 scp -P 端口号 要传的文件 服务器用户名服务器IP:服务器目录scp下载 scp -P 端口号 服务器用户名服务器IP:服务器目录 要下载的文件在实际情况下如果目标服务器无法通过ssh直接连接&#xff0c;需要跳板机才能连接&#xff0c;如何使用scp呢&#xff1f; 跳板机host…

​​​​​​​Python---练习:打印直角三角形(利用wihle循环嵌套)

案例&#xff1a; 打印直角三角形&#xff0c;特征&#xff1a;一共有5行&#xff0c;第1行&#xff0c;有1列。第2行&#xff0c;有2列&#xff0c;第3&#xff0c;有3列。 思考&#xff1a; pycharm里面&#xff0c;输出三角形&#xff0c;因为本来控制台就是长方形&#…

PLC单按钮启停算法汇总

单按钮启停在三菱PLC里可以通过简单的取反指令"ALT"实现,西门子PLC如何实现ALT指令,请参考下面文章链接,这篇博客我们汇总常用的单按钮启停实现方法,希望大家读了本篇博客后有所收获。 博途ALT指令 博途S7-1200/1500PLC 取反指令(ALT)-CSDN博客SMART PLC的ALT指…

62 最小路径和

最小路径和 题解1 DP 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条 从左上角到右下角的路径&#xff0c;使得路径上的 数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 题解1 DP class Solution { public:int minPathSum(vector&l…

从传统云架构到云原生生态体系架构的演进

文章目录 概述传统云架构&#xff1a;虚拟化的时代云原生生态体系架构的兴起容器化和微服务架构自动化和自动伸缩基础设施即代码云原生存储和数据库 云原生的影响结语 概述 随着科技的不断发展&#xff0c;云计算领域也经历了巨大的变革。这一演进的核心焦点是从传统云架构过渡…

活动回顾∣企企通亮相高质量企业数字化活动,深入探讨各领域采购数字化转型与变革

当前&#xff0c;以数字技术为代表的新一轮科技革新正在加速兴起&#xff0c;数字经济已成为推动我国社会经济发展的重要引擎&#xff0c;而数字化转型也成为构筑企业竞争新优势的有力支撑。 作为企业数字化采购与供应链协同服务的优秀厂商&#xff0c;企企通近期受邀参加了多场…

Redis为什么变慢了

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。 所以,你只有了解了你的…

TechSmith Camtasia 2023 for Mac 屏幕录像视频录制编辑软件

​ TechSmith Camtasia for Mac 2023中文破解版 是一款专业的屏幕录像视频录制编辑软件&#xff0c;非常容易就可以获得精彩的截屏视频。创建引人注目的培训&#xff0c;演示和演示视频。Camtasia 屏幕录制软件简化&#xff0c;直观&#xff0c;让您看起来像专业人士。利用Camt…

图(graph)的遍历----深度优先(DFS)遍历

目录 前言 深度优先遍历&#xff08;DFS&#xff09; 1.基本概念 2.算法思想 3.二叉树的深度优先遍历&#xff08;例子&#xff09; 图的深度优先遍历 1.图(graph)邻接矩阵的深度优先遍历 思路分析 代码实现 2.图(graph)邻接表的深度优先遍历 思路分析 代码实现 递…

为什么需要it企业知识库?it企业知识库能带来什么?

在企业运营过程中&#xff0c;会产生大量的经营数据、管理规范、资料和文档等数据&#xff0c;但这些数据的产生时间和空间碎片化&#xff0c;数据来源和结构多种多样&#xff0c;信息关系也较为复杂。 it企业知识库 正是因为这些问题的存在&#xff0c;导致了企业信息管理零散…

【API篇】七、Flink窗口

文章目录 1、窗口2、分类3、窗口API概览4、窗口分配器 在批处理统计中&#xff0c;可以等待一批数据都到齐后&#xff0c;统一处理。但是在无界流的实时处理统计中&#xff0c;是来一条就得处理一条&#xff0c;那么如何统计最近一段时间内的数据呢&#xff1f; ⇒ 窗口的概念&…

ImportError: DLL load failed while importing MPI: 找不到指定的模块

在运行下面这行python代码时会报错 from mpi4py import MPI 原因就是缺少MPI模块 解决方法如下&#xff1a; 1.在MPI官网下载msmpisetup.exe和msmpisdk.msi两个文件&#xff0c;并且安装到默认路径下 2.添加环境变量 进入“控制面板——>高级系统设置——>环境变量”…

QWidget快速美化-蓝色分割线

将代码复制进Line的样式表 效果: 代码: Line{height:5background-color: rgba(255, 255, 255, 0);border-top:2px solid #52DCFE; }

SysTick—系统定时器

SysTick 简介 SysTick—系统定时器是属于CM3内核中的一个外设&#xff0c;内嵌在NVIC中。系统定时器是一个24bit 的向下递减的计数器&#xff0c;计数器每计数一次的时间为1/SYSCLK&#xff0c;一般我们设置系统时钟SYSCLK 等于72M。当重装载数值寄存器的值递减到0的时候&#…

基于蚁狮算法的无人机航迹规划-附代码

基于蚁狮算法的无人机航迹规划 文章目录 基于蚁狮算法的无人机航迹规划1.蚁狮搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蚁狮算法来优化无人机航迹规划。 1.蚁狮搜索算法 …