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

寻找左边第一个更小值

题目:

给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。要求:时间复杂度为O(N)

思路:

从左往右将序列中的数与栈顶元素比较,如果小于栈顶元素,则弹栈并继续比较,直到栈顶元素大于等于当前的数或栈空。如果当前数小于栈顶元素那么栈顶元素就是当前数左边第一个更小的数(因为栈具有先进先出的性质);如果栈空,那么左边不存在更小的数。接着将当前数入栈,继续遍历序列……

代码:

#include<iostream>
#include<stack>
#include<vector>
using namespace std;

vector<int> decStack(vector<int> v1)
{
	stack<int> s;
	vector<int> v2;
	for (auto it = v1.begin(); it != v1.end(); it++)
	{
		while (!s.empty() && *it < s.top())//小于则出栈继续寻找
			s.pop();
		if (s.empty())//如果栈空则不存在
			v2.push_back(-1);
		else//如果大于或等于,栈顶元素就是左边第一个比当前元素小的数
			v2.push_back(s.top());
		s.push(*it);
	}
	return v2;
}

int main()
{
	vector<int> v1 = { 2,1,3,5,4 };
	vector<int> v2 = decStack(v1);
	for (auto it = v2.begin(); it != v2.end(); it++)
	{
		cout << *it << " ";
	}
	return 0;
}

原理:单调栈

单调栈即从栈顶至栈底单调递增或者单调递减的栈。常有如下应用场景:

(1)寻找序列数左侧第一个更小值(单调递减栈):方法如上

(2)寻找序列数左侧第一个更大值(单调递增栈):方法与上面类似,一直寻找大于序列数的栈元素,小于的出栈;或者直到栈空。然后将当前序列数入栈,继续遍历……

时间复杂度:

每个序列数至多入栈一次、出栈一次,时间复杂度为O(n)

参考:单调栈详解及其应用-CSDN博客

相关文章:

  • RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”
  • 感知识别算法Jetson环境部署测试记录
  • 【AVRCP】深度剖析 AVRCP 中 Generic Access Profile 的要求与应用
  • RHCE 使用nginx搭建网站
  • Linux进程信号(下:补充)
  • 分布式任务调度框架XXl-job
  • 蓝桥杯备考:二分答案之路标设置
  • 大模型-提示词工程与架构
  • RK3588开发笔记-RTL8852wifi6模块驱动编译报错解决
  • Linux操作系统7- 线程同步与互斥4(基于POSIX条件变量的生产者消费者模型)
  • moveit2基础教程上手-使用xarm6演示
  • 【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)
  • 『 C++ 』错误使用std::mutex引发的error C2039: “try_lock_until“: 不是 “std::mutex“ 的成员
  • vue3:十一、主页面布局(左侧菜单折叠展开设置)
  • vulnhub靶场之【hack-me-please靶机】
  • 微前端框架深度对比与技术实现剖析
  • Cursor的五种高级用法
  • 数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记
  • 权限维持—Linux系统Rootkit后门
  • 云原生之开源遥测框架OpenTelemetry(在 Gin 框架中使用 OpenTelemetry 进行分布式追踪和监控)
  • 直播电商行业代表呼吁:携手并肩伸出援手助力外贸企业攻坚克难
  • 中国体育报关注徐梦桃、王曼昱、盛李豪等获评全国先进工作者:为建设体育强国再立新功
  • 西班牙葡萄牙突发全国大停电,欧洲近年来最严重停电事故何以酿成
  • 北汽蓝谷一季度净亏损9.5亿元,拟定增募资不超60亿元
  • 新剧|反谍大剧《绝密较量》央一开播,张鲁一高圆圆主演
  • 深一度|“凑合过”的利物浦,英超第二冠只求性价比