acwing-830.单调栈

本文介绍如何使用单调栈解决寻找左侧最近较小值的问题,并提供两种实现方式:一种是通过数组模拟单调栈,另一种是直接利用C++标准库中的stack容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。

输入格式 第一行包含整数 N,表示数列长度。

第二行包含 N 个整数,表示整数数列。

输出格式 共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。

数据范围

1≤N≤105
1≤数列中元素≤109

输入样例

5
3 4 2 7 5

输出样例

-1 3 -1 2 2

在这里插入图片描述

代码

模拟单调栈
 //数组模拟 
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int stk[N] ,tt;//tt相当于指针 
int main(){
	cin >> n;
	for(int i = 0; i < n; i++){
		int x;
		cin >> x;
		while (tt && stk[tt] >= x) tt--;//tt不为0,而且模拟栈顶大于x,指针下移 
		if(tt) cout << stk[tt] << " ";//找到那个刚好小于x的,输出 
		else cout << -1 << " ";//否则输出-1 
		stk[++ tt] = x;//然后压入栈中 
	}
	return 0;
}
单调栈

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int N = 100010;
int q[N], n;
stack<int > num;

int main(){
	cin >> n;
	
	for(int i = 0; i < n; i++)
	{    cin >>q[i];
	//第一个肯定要输出-1,而且要进栈 
		if(i == 0 ){
			printf("-1 ");
			num.push(q[i]);
			//如果栈顶元素小于要q[i],输出栈顶元素,然后压栈	
		}else if(num.top() < q[i]){
			printf("%d ", num.top());
	        num.push(q[i]);
		}else {	
		
			while(num.top() >= q[i]){
			num.pop();
			if(num.empty())	break;//栈为空的话,跳出循环 
		  }	if(num.empty()) printf("-1 ");//栈为空的话,打印-1 
		    else printf("%d ", num.top());//如果栈不是空,那么输出栈顶元素 
		    num.push(q[i]);	//再压入新元素 
		}
	 } 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值