单调栈及相关题解

单调递增栈:栈中数据入栈单调递增序列(栈底到栈顶是单调递增);
单调递减栈:栈中数据入栈单调递减序列(栈底到栈顶是单调递减)。

单调递增栈:

维护单调递增栈:遍历数组中每一个元素,执行入栈:每次入栈前先检验栈顶元素和进栈元素的大小。
如果栈空或进栈元素大于栈顶元素则直接入栈;如果进栈元素小于等于栈顶元素,则出栈,直至进栈元素大于栈顶元素。

int a[max];
int n;
stack<int>q;
for (int i = 1; i <= n; i++) {while (!q.empty() && a[i] <= q.top()) {q.pop();}q.push(a[i]);
}

单调递减栈:

维护单调递增栈:遍历数组中每一个元素,执行入栈:每次入栈前先检验栈顶元素和进栈元素的大小。
如果栈空或进栈元素小于栈顶元素则直接入栈;如果进栈元素大于等于栈顶元素,则出栈,直至进栈元素小于栈顶元素。

int a[max];
int n;
stack<int>q;
for (int i = 1; i <= n; i++) {while (!q.empty() && a[i] >=q.top()) {q.pop();}q.push(a[i]);
}

题解:

 运用单调递减栈,并用标记下标的方式来入栈,当找到一个元素大于栈顶元素时,用另外一个数组来记录栈顶元素对应的下一个最大值(此题我用的为手搓栈)

#include <stdio.h>// 定义一个足够大的数组来模拟栈(这里假设数列元素个数不会超过1000,可根据实际情况调整)
#define MAX_SIZE 1000
int stack[MAX_SIZE];
int top = -1;// 判断栈是否为空
int stack_empty() 
{return top == -1;
}// 入栈操作
void stack_push(int element)
{if (top < MAX_SIZE - 1) {stack[++top] = element;}
}// 出栈操作
int stack_pop()
{if (!stack_empty()){return stack[top--];}return -1;  // 表示栈为空时的一种返回情况
}// 获取栈顶元素
int stack_peek() 
{if (!stack_empty()) {return stack[top];}return -1;  // 表示栈为空时的一种返回情况
}// 求f(1...n)
void find_f(int* a, int n, int* result) 
{for (int i = n - 1; i >= 0; i--){while (!stack_empty() && a[stack_peek()] <= a[i]){stack_pop();}result[i] = stack_empty() ? 0 : stack_peek() + 1;stack_push(i);}
}int main() 
{int n;scanf("%d", &n);int a[n];for (int i = 0; i <n; i++)scanf("%d", &a[i]);int result[n];find_f(a, n, result);for (int i = 0; i < n; i++){printf("%d ", result[i]);}return 0;
}

 此题与上一题大致相同,都是向右查找第一个大于他的值,所以也用单调递减栈

#include <iostream>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
int a[100000], b[100000];
int n;
int main() {cin >> n;stack<int>q;for (int i = 0; i <n; i++) {cin >> a[i];}memset(b, 0, sizeof(b));q.push(0);for (int i = 1; i <= n; i++) {while (!q.empty() && a[i] > a[q.top()]) {b[q.top()] = i+1;q.pop();}q.push(i);}for (int i = 0; i < n; i++) {cout << b[i] << endl;}return 0;
}

 后缀最大值就是向后第一个大于他的值,与上两题相同,不过此处要求的是位异或和

 (此题我用的数组模拟栈,如果要换成栈的话直接将数组b改成栈即可)

 

#include<iostream>
using namespace std;
unsigned long long a[1000001];
int b[1000001], n;
int main() {scanf("%d", &n);int j = 0, i;int ans = 0;for (int i = 1; i <= n; i++) {scanf("%llu", &a[i]);if (j == 0) {b[++j] = i;ans = ans ^ i;}else {if (a[i] < a[b[j]]) {b[++j] = i;ans = ans ^ i;}else {while (j > 0 && a[i] >= a[b[j]]) {ans = ans ^b[j]; j--;}b[++j] = i;ans = ans ^ i;}}printf("%d\n", ans);}return 0;
}

 

 单调递减栈,不过此处的等于要单独进行讨论,并且用结构体记录人数

#include<iostream>
#include<stack>
# define int long long
const int maxx = 1000000;
using namespace std;
int n;
struct node {int h, num;
}a[maxx];
long long ans;
stack<node>q;
signed main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].h, a[i].num = 1;}int ans = 0;for (int i = 1; i <= n; i++) {while(!q.empty() && a[i].h > q.top().h){ans += q.top().num;q.pop();}if (!q.empty() && a[i].h == q.top().h){node qwq = q.top();ans += q.top().num;q.pop();if (!q.empty())ans++;q.push(node{ qwq.h, qwq.num + 1 });}else{if (!q.empty())ans++;q.push(a[i]);}}cout << ans;return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…

P1878 舞蹈课(详解)c++

题目链接&#xff1a;P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;我们可以发现任意两个相邻的都是异性&#xff0c;所以他们的舞蹈技术差值我们都要考虑&#xff0c;4和2的差值是2&#xff0c;2和4的差值是2&#xff0c;4和3的差值是1&#xff0c;根…

基于HAL库的按钮实验

实验目的 掌握STM32 HAL库的GPIO输入配置方法。 实现通过按钮控制LED亮灭&#xff08;支持轮询和中断两种模式&#xff09;。 熟悉STM32CubeMX的外部中断&#xff08;EXTI&#xff09;配置流程。 实验硬件 开发板&#xff1a;STM32系列开发板&#xff08;如STM32F103C8T6、N…

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等&#xff0c;载体&#xff08;特别是涉密载体&#xff09;是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…

Spring Cloud-Sentinel

Sentinel服务熔断与限流 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。 官网地址&#xff1a;home | Sentinelhttps://sen…

土星云边缘计算微服务器 SE110S-WA32加持DeepSeek,本地部署企业私有推理大模型!

模型介绍 DeepSeek-R1-Distill-Qwen-7B是一款高性能的语言模型&#xff0c;基于DeepSeek-R1的推理能力&#xff0c;通过蒸馏技术将推理模式迁移到较小的Qwen模型上&#xff0c;在保持高性能的同时&#xff0c;显著降低了资源消耗&#xff0c;更适合在资源受限的环境中部署。 该…

React进阶之React核心源码解析(二)

React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render&#xff1a;内存中的更新&#xff0c;主要是通过递归的过程&#xff0c;来将react变化的部分&#xff0c;在内存中找到哪些…

安装WPS后,导致python调用Excel.Application异常,解决办法

在使用xlwings编辑excel文件时&#xff0c;默认调用的是“Excel.Application”&#xff0c;如果安装过wps&#xff0c;会导致该注册表为WPS&#xff0c;会导致xlwings执行异常 因为安装过WPS&#xff0c;导致与Excel不兼容的问题&#xff0c;想必大家都听说过。有些问题及时删…

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…

鸿蒙面试题

1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?

基于 Filebeat 的日志收集

在现代分布式系统中&#xff0c;日志数据作为关键的监控与故障排查依据&#xff0c;越来越受到重视。本文将深入探讨 Filebeat 的技术原理、配置方法及在 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;生态系统中的应用&#xff0c;帮助开发者构建高效、稳定的日…

wireshark网络抓包

由于图片和格式解析问题&#xff0c;可前往 阅读原文 到这里已经讲了两个抓包工具的使用了&#xff0c;大家应该对抓包不是很陌生了。而wireshark相对于fiddler和charles更加偏向于网络层面的抓包或者说是一个网络封包分析工具。使用对象更适合于网络相关人员(网络管理员/相关运…

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…

bitcoinjs学习1—P2PKH

1. 概述 在本学习笔记中&#xff0c;我们将深入探讨如何使用 bitcoinjs-lib 库构建和签名一个 P2PKH&#xff08;Pay-to-PubKey-Hash&#xff09; 比特币交易。P2PKH 是比特币网络中最常见和最基本的交易类型之一&#xff0c;理解其工作原理是掌握比特币交易构建的关键。 想要详…

2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)

2024年博客之星年度评选—创作影响力评审主题文章创作评审目前排名 2024年博客之星主题文章创作评审文章得分公布&#xff01;2024年博客之星创作影响力评审2024年博客之星主题文章创作评审目前排名公布&#xff01; 【2024博客之星】恭喜完成✅主题创作的226位博主&#xff0…

机器学习-1:线性回归

常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…

java每日精进 2.13 Ganache(区块链本地私有化部署)

需求&#xff1a;使用区块链实现数据村存储&#xff0c;记录一些不可篡改的交互信息&#xff0c;网络环境为内外网均需要部署&#xff1b; 1.准备工作&#xff08;软件安装&#xff09; 1.1 安装 Node.js 和 npm 1.2 安装 Ganache 地址如下&#xff1a;windows有可视化界面 &a…

RAGFlow和Dify对比

‌ RAGFlow和Dify都是基于大语言模型&#xff08;LLM&#xff09;的应用开发平台&#xff0c;具有相似的功能和应用场景&#xff0c;但它们在技术架构、部署要求和用户体验上存在一些差异。‌‌ RAGFlow和Dify对比 2025-02-13 22.08 RAGFlow‌ ‌技术栈‌&#xff1a;RAGFlow…

day9手机创意软件

趣味类 in:记录趣味生活&#xff08;通用&#xff09; 魔漫相机&#xff1a;真人变漫画&#xff08;通用&#xff09; 活照片&#xff1a;让照片活过来&#xff08;通用&#xff09; 画中画相机&#xff1a;与众不同的艺术 年龄检测仪&#xff1a;比一比谁更年轻&#xf…