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

单调栈问题

原理

单调栈的核心原理是:在栈内保持元素的单调性(递增或递减)

单调递增栈

用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时,直接入栈;否则,一直从栈顶弹出元素,直到栈顶元素小于新元素或栈为空。

单调递减栈:

用于处理“下一个更大的元素”问题。当新元素比栈顶元素大时,一直从栈顶弹出元素,直到栈顶元素大于新元素或栈为空,然后将新元素入栈。

核心代码框架

#include <vector>
#include <stack>
using namespace std;vector<int> nextGreaterElement(vector<int>& nums) {int n = nums.size();vector<int> res(n, -1);  // 默认值为-1,表示没有找到stack<int> stk;          // 用于存储元素索引的单调栈for (int i = 0; i < n; i++) {// 维护栈的单调递减性while (!stk.empty() && nums[stk.top()] < nums[i]) {int idx = stk.top(); // 栈顶元素索引stk.pop();res[idx] = nums[i]; // 找到了下一个更大的元素}stk.push(i); // 入栈当前元素索引}return res;
}

739. 每日温度

在这里插入图片描述

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n = temperatures.size();vector<int> res(n,0);stack<int>stk;for(int i = 0;i<n;i++){// 递增while(!stk.empty() && temperatures[stk.top()]<temperatures[i]){int index = stk.top(); // 栈顶元素stk.pop();res[index] = i-index;//res[index] = temperatures[i];}stk.push(i);}for(int i = 0;i<n;i++){cout<<res[i]<<endl;}return res;}
};

496.下一个更大元素 I

在这里插入图片描述
思路:暴力法

直接足步循环
先找到和 nums1 对应的 nums2 数,找到后,在循环找更大的,找到就退出

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {int n = nums1.size();int m = nums2.size();vector<int> res (n,-1); // -1代表没找到stack<int>stk;for(int i = 0;i<n;i++){int j = 0;while(nums1[i] != nums2[j]){j++;}for(int k = j+1; k<m;k++){if(nums2[k]>nums1[i]){res[i] = nums2[k];break;}}}return res;}
};

思路二:单调栈

我们可以先对 nums2 进行单调栈,找到他每个元素的的下一个更大的数
再根据 nums1 创建数组

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {int n = nums1.size();int m = nums2.size();unordered_map<int, int> nxetnum;vector<int> res (n,-1); // -1代表没找到stack<int>stk;// 遍历 nums2for(int num : nums2){while(!stk.empty()&& stk.top()<num){nxetnum[stk.top()] = num;stk.pop();}stk.push(num);}// 如果没有更大元素,则对应结果为 -1;while(!stk.empty()){nxetnum[stk.top()] = -1;stk.pop();}// 从nums1 中查找对应的;for(int i = 0;i<n;i++){res[i] = nxetnum[nums1[i]];}return res;}
};

503.下一个更大元素II

在这里插入图片描述
思路:

因为可以循环,直接将数组进行拼接,这样就破解循环问题了,就如同前面的每日温度问题了

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int>realnums;// 暴力拼接for(int i = 0; i<2;i++){for(int num:nums){realnums.push_back(num);}}vector<int> res(2*n,-1);stack<int>stk;for(int i = 0;i<realnums.size();i++){while(!stk.empty() && realnums[stk.top()]<realnums[i]){int index = stk.top();stk.pop();res[index] = realnums[i];}stk.push(i);}vector<int>resnum;resnum.insert(resnum.end(),res.begin(),res.begin()+n);return resnum;}
};

代码优化一下:

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

相关文章:

单调栈问题

原理 单调栈的核心原理是&#xff1a;在栈内保持元素的单调性&#xff08;递增或递减&#xff09; 单调递增栈&#xff1a; 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时&#xff0c;直接入栈&#xff1b;否则&#xff0c;一直从栈顶弹出元素&#xff0c…...

Hexo博客重新部署与Git配置

由于电脑重装了一次&#xff0c;发现之前Hexo与NexT主题版本过于落后&#xff0c;重新部署了下。 1 Node.js与git安装 这一块安装就不赘述了。去两个官网找安装文件安装即可。 node.js git 打开git以后配置的几个关键命令行。 git config --global user.name "你的gi…...

KUKA机器人专业名词解释

1、CCU Cabinet Control Unit &#xff08;控制柜控制单元&#xff09; 2、CIB Cabinet Interface Board &#xff08;控制柜接口板&#xff09; 3、HMI Human Machine Interface &#xff08;人机界面&#xff09;&#xff1b;KUKA.HMI 是 KUKA 操作界面。 4、KCB …...

阿里云 物联网平台 MQTT连接、数据传输

阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机&#xff0c;读取设备、仪器、MES或者电子元器件的数据&#xff0c;MQTT传输至阿里云平台&#xff0c;可视化界面构建界面&#…...

栈和队列OJ练习题及解答

前言 上一篇博客已经讲到了栈和队列的数据结构&#xff0c;概括一下&#xff1a;栈后进先出&#xff08;Last In First Out&#xff09;、队列先进先出&#xff08;First In First Out&#xff09;。那么&#xff0c;接下来就来讲讲&#xff0c;关于栈和队列的相关练习题&#…...

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环&#xff0c;它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险&#xff0c;还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…...

电力乙级资质延伸换证:企业转型的契机

电力乙级资质延伸换证不仅是企业合规运营的必要步骤&#xff0c;同时也为企业转型提供了重要的契机。在这个过程中&#xff0c;企业可以重新审视自身的业务模式、管理体系、技术能力等方面&#xff0c;寻找新的增长点和发展方向。 首先&#xff0c;电力乙级资质延伸换证要求企业…...

基于Redis实现分布式锁——Java版本

基于Redis实现分布式锁——Java版本 版本一版本二版本三Redisson 定义分布式锁接口如下&#xff1a; public interface ILock {boolean tryLock(long timeoutSec);void unlock(); }版本一 设定业务超时时间&#xff0c;到期自动解锁。缺点是超时时间不好估计&#xff0c;需要…...

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…...

Lua 基础 01 入门

Lua 基础相关知识 第一期 注释 -- 单行注释--[[多行注释 --]]-- 多加一个横杠符号就能重新启用注释内的代码 ---[[print("Lua") --]]数据类型 Lua 是动态类型语言&#xff0c;变量不需要类型定义&#xff0c;只需要为变量赋值。 Lua 有 8 种基本类型&#xff1a…...

远程连接阿里云ECS

说明&#xff1a;ECS&#xff08;阿里云服务器&#xff09;可选择的系统镜像如下&#xff1a; 本文介绍基于Windows系统&#xff0c;对CentOS、Ubuntu、Windows这三个操作系统的连接方式&#xff0c;以及连接工具Windterm的使用。 CentOS & Windterm CentOS是我使用时间最…...

【C++】多态(上)超详细

封装&#xff0c;继承&#xff0c;多态不只是C的三大特性&#xff0c;而是面向对象编程的三大特性。 什么是多态&#xff1a; 不同的对象做同一件事情&#xff0c;结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写&#xff08;需要满足三同&#xff1a;函…...

【Git】 Git分支操作指南

隐形的纪念躲在心里面 也许吧 也许不会再见 阴天或晴天 一天又一年 风它在对我说莫忘这一切 &#x1f3b5; 蔡淳佳《隐形纪念》 Git是一种非常强大的分布式版本控制系统&#xff0c;允许用户在开发过程中创建不同的分支&#xff08;branch&#xff09;来分…...

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求

目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一&#xff1a;某智慧旅游城市建设项目 案例二&#xff1a;某景区智慧化改造项目…...

AtCoder Beginner Contest 310 E题 NAND repeatedly

E题&#xff1a;NAND repeatedly 标签&#xff1a;动态规划题意&#xff1a;给定一个长度为 n n n的 01 01 01字符串 A i A_i Ai​&#xff0c;给定规则&#xff1a; 0 ⊼ 0 1 , 0 ⊼ 1 1 , 1 ⊼ 0 1 , 1 ⊼ 1 0 0⊼01,0⊼11,1⊼01,1⊼10 0⊼01,0⊼11,1⊼01,1⊼10。 求 ∑…...

一款简易的免费抽奖软件

一、介绍 这款抽奖软件设计简洁&#xff0c;操作便捷。用户可以轻松将参与名单通过EXCEL文件导入至程序中&#xff0c;并可根据需要设定各类奖品和对应的中奖人数。在选定了奖品后&#xff0c;用户只需点击“开始”按钮&#xff0c;随后再按下“暂停”按钮&#xff0c;软件便会…...

Kubernetes 监控管理

目录 1. Metrics Server2. Prometheus & Grafana3. cAdvisor4. 日志收集5. 告警与通知6. 最佳实践 Kubernetes 监控管理是确保集群稳定运行和应用服务质量的关键环节。它涉及收集、聚合、分析集群及其上运行的应用程序的各种指标和日志数据。 1. Metrics Server 作用&…...

哈希表第6/9题--四数相加II

题目描述&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&…...

使用JavaScript将富文本HTML转换为纯文本

在Web开发中&#xff0c;我们经常需要处理HTML内容&#xff0c;但有时为了特定的目的&#xff0c;比如文本处理、搜索或显示在非HTML环境中&#xff0c;我们可能希望将富文本HTML转换为纯文本。这里&#xff0c;我们将探讨如何使用JavaScript来实现这一功能。 为什么要将HTML转…...

2024-05-13 问AI: 介绍一下 google wavenet 声码器

文心一言 Google的WaveNet声码器是一个深度学习模型&#xff0c;用于生成高质量的音频信号&#xff0c;特别是人类语音。与传统的声码器相比&#xff0c;WaveNet可以生成更加自然和流畅的音频&#xff0c;因为它直接模拟了原始音频信号的波形生成过程。 WaveNet的核心思想是使…...

算法审判日:用Git记录定程序员罪孽

一、版本控制的“审判台”在软件质量保障体系中&#xff0c;Git早已超越单纯的版本管理工具&#xff0c;演变为代码行为的“司法档案库”。每一次git commit都是程序员在数字法庭上的宣誓证词&#xff0c;而git blame则成为测试人员追溯缺陷根源的刑侦工具。罪证链条的三重维度…...

北斗高精度数据解算:破解城市峡谷/长基线/无网区难题,从毫米级定位到自动化交付——(GAMIT/GLOBK底层核心解算技术方法)

北斗三号全面应用已至深水区&#xff0c;一线甲级测绘单位与科研院所正面临三重实战拷问&#xff1a;城市峡谷多路径干扰下如何实现毫米级收敛&#xff1f;西部高海拔无网区如何依托离线精密轨道完成长基线高精度解算&#xff1f;国家重大工程"零误差"标准下&#xf…...

NVMe 2.0 Boot Partitions:解锁高效固件更新的双分区机制

1. 为什么我们需要NVMe 2.0的双启动分区&#xff1f; 想象一下你正在给手机升级系统&#xff0c;突然断电了——传统单分区方案会让设备直接变砖&#xff0c;而NVMe 2.0的双启动分区就像给系统上了双保险。这个设计最初是为了解决企业级SSD在724小时运行时的固件更新难题&#…...

从“认怂”到“被看见”:flomo的产品设计哲学

当大多数笔记软件都在追求“大而全”时&#xff0c;有一款产品选择了一条完全不同的路。它不让你写标题&#xff0c;不支持复杂排版&#xff0c;甚至在官网上大大方方地列出“自己不擅长什么”。它的创始人说&#xff1a;“35岁再创业&#xff0c;我学会了认怂。”它就是flomo&…...

OLAP] DuckDB : 开源免费的、面向嵌入式场景、列式存储的分析型数据库

0 序 DuckDB 是近期非常火的一款 AP 数据库&#xff0c;其独特的定位很有趣。甚至有数据库产品考虑将其纳入进来&#xff0c;作为分析能力的扩展。 考虑到项目中一个数据处理场景&#xff0c;就此调研一二。 DuckDB 的爆火&#xff0c;也给所有盲目追逐“大数据”的技术人敲响…...

Bidili Generator实操演示:LoRA权重强度与CFG Scale协同调优黄金组合

Bidili Generator实操演示&#xff1a;LoRA权重强度与CFG Scale协同调优黄金组合 1. 引言&#xff1a;当定制化风格遇上精细控制 如果你用过Stable Diffusion XL&#xff08;SDXL&#xff09;来生成图片&#xff0c;可能会遇到这样的困扰&#xff1a;好不容易找到一个喜欢的L…...

保姆级教程:用ESP8266-01S和机智云固件,5分钟搞定智能硬件联网(附烧录软件下载)

5分钟极速上手&#xff1a;ESP8266-01S与机智云固件实战指南 当你想把一盏台灯变成手机可控的智能设备&#xff0c;或是让温湿度传感器数据实时上传云端时&#xff0c;ESP8266-01S这个小巧的Wi-Fi模块就是最佳选择。它价格低廉、功能强大&#xff0c;配合机智云的固件&#xf…...

Turbo Boost Switcher设备适配完全指南:从系统要求到机型验证全流程

Turbo Boost Switcher设备适配完全指南&#xff1a;从系统要求到机型验证全流程 【免费下载链接】Turbo-Boost-Switcher Turbo Boost disabler / enable app for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/tu/Turbo-Boost-Switcher Turbo Boost Switcher是一款…...

Pinyin-pro 3.15.1版本避坑指南:老项目兼容性问题解决方案

Pinyin-pro 3.15.1版本避坑指南&#xff1a;老项目兼容性问题解决方案 在技术迭代飞快的今天&#xff0c;前端开发者常常面临一个尴尬局面&#xff1a;新发布的工具库在功能上令人惊艳&#xff0c;却因为底层依赖或语法特性与老项目环境不兼容而无法直接使用。Pinyin-pro作为中…...

如何高效管理游戏资源:GodotPckTool 完全指南与5个实战技巧

如何高效管理游戏资源&#xff1a;GodotPckTool 完全指南与5个实战技巧 【免费下载链接】GodotPckTool Standalone tool for extracting and creating Godot .pck files 项目地址: https://gitcode.com/gh_mirrors/go/GodotPckTool GodotPckTool 是一个独立的命令行工具…...