算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列

news2024/11/15 21:21:10

算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列


文章目录

  • 算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列
  • 前言
  • 一、链表
    • 1.单链表
    • 2.双链表
  • 二、栈和队列
    • 1.普通栈、队列
    • 2.单调栈
    • 3.单调队列
  • 三、 拓展:ios::sync_with_stdio(false) 和 cin.tie(0) 对cin,cout速率的影响:
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、链表



在这里插入图片描述



1.单链表

在这里插入图片描述



在这里插入图片描述



#include <iostream>

using namespace std;

const int N = 100000 + 10;

//head:表示头结点的下标
//e[i]:表示结点i的值
//ne[i]:表示结点i的next指针是多少
//idx:存储当前已经用到了那个点(从0开始)
int head, e[N], ne[N], idx;

//初始化:
void init()
{
	head = -1;
	idx = 0;
 } 

//将x插入到头结点:
void add_to_head(int x)
{
	e[idx] = x;
	ne[idx] = head;
	head = idx;
	idx ++;
 } 
 
 // 将x插入到下标是k的点后面:
 void add(int k, int x)
 {
 	e[idx] = x;
 	ne[idx] = ne[k];
 	ne[k] = idx;
 	idx ++;
  } 
  
// 将下标是k的点后面的点删除
void remove(int k)
{
	ne[k] = ne[ne[k]];
 } 


int main()
{
	int m;
	cin >> m;
	
	init();
	
	while(m --)
	{
		char op;
		int x, k;
		cin >> op;
		if(ip == 'H')
		{
			cin >> x;
			add_to_head(x);
		}
		else if(ip == 'D')
		{
			cin >> k;
			if(!k) head = ne[head];//注意1:删除头结点 
			remove(k - 1);
		}
		else
		{
			cin >> k >> x;
			add(k - 1, x);
		}
	}
	
	for(int i - head; i != -1; i = ne[i]) cout << e[i] << ' ';
	cout << endl;
	return 0;
}


2.双链表



在这里插入图片描述



在这里插入图片描述



在这里插入图片描述



#include <iostream>

using namespace std;

const int N = 100000 + 10;

int m;
int e[N], l[N], r[N], idx;

//初始化:
void init()
{
	//0表示左端点,1表示右端点
	r[0] = 1, l[1] = 0;
	idx = 2; 
 } 
 
 //在下标是k的结点后,插入x : 
void add(int k, int x)
{
	e[idx] = x;
	r[idx] = r[k];//idx的右边 
	l[idx] = k;//idx的左边 
	l[r[k]] = idx;//k右边结点的左边 
	r[k] = idx;//k的右边 
}

//删除第k个点:
void remove(int k)
{
	r[l[k]] = r[k];//k左边节点的右边,连接k的右边的结点 
	l[r[k]] = l[k];//k右边结点的左边,连接k的左边的结点 
 } 


二、栈和队列

1.普通栈、队列



在这里插入图片描述



#include <iostream>

using namespace std;

const int N = 100000 + 10;

// ***************************栈:

int stk[N], tt;//stk:栈, tt:栈顶

//插入:
stk[++ tt] = x;//从 1 开始

//弹出:
tt --;

// 判断栈是否为空:(伪代码)
if(tt > 0) not empty;
else empty;

// 栈顶 :
stk[tt];

// ***************************队列:
int q[N], hh, tt = -1;//hh:对头, tt:对尾

// 插入:
q[++ tt] = x; 

// 弹出:
hh ++;

// 判断队列是否为空:
if(hh <= tt) not empty;
else empty;

// 取出对头元素: 
q[hh];
 


2.单调栈

例题:给一个长度为N的整数序列,输出每个数昨天第一个比他小的数,如果不存在就输出-1。



在这里插入图片描述



在这里插入图片描述



//例题:给一个长度为N的整数序列,输出每个数昨天第一个比他小的数,
//如果不存在就输出-1。
#include <iostream>

using namespace std;

const int N = 100000 + 10;

int n;
int stk[N], tt;

int main()
{
	cin >> n;
	
	for(int i = 0; i < n; i ++)
	{
		int x;
		cin >> x;
		//单调栈 
		//在我们维护的栈中,移去比当前数“x”大的数 
		while(tt & stk[tt] >= x) tt--;
		//此时,栈顶元素就是 最近的 小于x的数
		if(tt) cout << stk[tt] << endl;
		else cout << -1 << end;
		
		stk[++ tt] = x;//将x进栈,仍然可以维护 单调栈。 
	}
	
	return 0;
}

3.单调队列

题目:给定一个大小为n<=10^6的数组,有一个大小为k的滑动窗口,它从数组的最左边移动感到最右边,你只能找窗口中看到k个数字。
你的任务是确定滑动窗口位于每个位置是,窗口中的最小值和最大值。



在这里插入图片描述


//题目:给定一个大小为n<=10^6的数组,有一个大小为k的滑动窗口,
//它从数组的最左边移动感到最右边,你只能找窗口中看到k个数字。
//你的任务是确定滑动窗口位于每个位置是,窗口中的最大值和最小值。

#include <iostream>

using namespace std;

const int N = 100000 + 10;

int n, k;
int a[N], q[N];//q:队列,队列存储的是 下标 

int main()
{
	scanf("%d%d", &n, &k);
	for(int i = 0; i < n; i ++) scnaf("%d", %a[i]);
	
	//窗口中的最小值
	int hh = 0, tt = -1;
	for(int i = 0; i < n; i ++) 
	{
		//判断对头是否已经 划出窗口:
		//使用if?每次移动一格。 
		if(hh <= tt && i - k + 1 > q[hh]) hh ++; 
		//将窗口内大于的元素 出队列(为什么从后面出队列?分析题目所得。
		while(hh <= tt && a[q[tt] >= a[i]]) tt --;
		q[++ tt] = i;//要先加入,i对应的值可能是最小的 
		if(i >= k - 1) printf("%d", a[q[hh]]);	
	 } 
	 put(" "); 
	//窗口中的最大值
	 int hh = 0, tt = -1;
	for(int i = 0; i < n; i ++) 
	{
		//判断对头是否已经 划出窗口:
		if(hh <= tt && i - k + 1 > q[hh]) hh ++;
		while(hh <= tt && a[q[tt] <= a[i]]) tt --;
		q[++ tt] = i;//i对应的值可能是最大的 
		if(i >= k - 1) printf("%d", a[q[hh]]);	
	 } 
	 put(" "); 
	return 0;
 } 


三、 拓展:ios::sync_with_stdio(false) 和 cin.tie(0) 对cin,cout速率的影响:

拓展:关于输入的速率问题
(1)cin,cout (1394ms)
(2)scanf,printf (133ms)
(3)ios::sync_with_stdio(false); + cin (1182ms)
(4)cin.tie(0); (141ms)
应用别人的博客来解释cin,cout的速率问题😍


总结

提示:这里对文章进行总结:
💕💕💕

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

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

相关文章

[LeetCode][102]二叉树的层序遍历——遍历结果中每一层明显区分

题目 102. 二叉树的层序遍历 给定二叉树的根节点 root&#xff0c;返回节点值的层序遍历结果。即逐层地&#xff0c;从左到右访问所有节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…

【计算机网络】TCP 的三次握手与四次挥手

通常我们进行 HTTP 连接网络的时候会进行 TCP 的三次握手&#xff0c;然后传输数据&#xff0c;之后再释放连接。 TCP 传输如图1所示&#xff1a; 图1 TCP 传输 TCP三次握手的过程如下&#xff1a; 第一次握手&#xff1a;建立连接。客户端发送连接请求报文段&#xff0c;将 …

深度学习模型部署(四)常用模型及推理平台评估指标

判断选择什么模型&#xff0c;什么量化方案&#xff0c;什么推理框架&#xff0c;最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度&#xff0c;但是运算速度是无法计算的&#xff0c;所以定义了一些间接标准来推测模型的…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

99%的商业模式都是可借鉴,解读法国葡萄酒庄长盛不衰的经营模式?

99%的商业模式都是可借鉴&#xff0c;解读法国葡萄酒庄长盛不衰的经营模式&#xff1f; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;很多朋友说到葡萄酒&#xff0c;有的第一印象就是“法国葡萄酒”…

全面对比Amazon DocumentDB 与 MongoDB

在云中部署 MongoDB 似乎有多种选择。例如&#xff0c;Amazon DocumentDB自称是完全支持 MongoDB API 的 AWS 原生数据库。虽然它支持一些 MongoDB 功能&#xff0c;但需要注意的是 DocumentDB 并不完全兼容 MongoDB。要在 AWS 上访问功能齐全的“MongoDB 即服务”&#xff0c;…

CCProxy代理服务器地址的设置步骤

目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件&#xff0c;可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…

用Python实现一个简单的——人脸相似度对比

近几年来&#xff0c;兴起了一股人工智能热潮&#xff0c;让人们见到了AI的能力和强大&#xff0c;比如图像识别&#xff0c;语音识别&#xff0c;机器翻译&#xff0c;无人驾驶等等。总体来说&#xff0c;AI的门槛还是比较高&#xff0c;不仅要学会使用框架实现&#xff0c;更…

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中&#xff0c;需要对接三方websocket协议数据或者连接并存储线上websocket协议数据&#xff0c;需要使用websocket客户端 连接线上的websocket服务端获取并存储数据&#xff0c;然后将数据存储成文件格式可移植&#xff0c;并将数据复制 到本地&#xff0c;…

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理&#xff0c;在C语言中需要编写多组代码分别处理&#xff0c;这样做显然太过繁琐&#xff0c;C增加了虚拟类型&#xff0c;使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…

免费的文案二次创作软件,打造高质量原创文案

在当今数字化时代&#xff0c;内容创作已经成为企业和个人推广自身品牌、产品和服务的重要手段。然而&#xff0c;对于许多人来说&#xff0c;撰写高质量的原创文案并非易事。幸运的是&#xff0c;随着技术的发展&#xff0c;出现了许多文案二次创作免费软件&#xff0c;为那些…

怎么做不限扫码次数的文件活码?文件可长期扫描展现下载

如何制作不限扫码次数的文件二维码呢&#xff1f;将文件转二维码后分享给其他人&#xff0c;是现在非常方便的一种文件传输方式。很多小伙伴在制作文件二维码的时候&#xff0c;比较担心的一个问题&#xff0c;就是二维码可以扫码的次数&#xff0c;担心达不到自己预期的效果&a…

保姆级讲解 Stable Diffusion

目录 本文讲解思路介绍 一、引入 二、Diffusion Model 三、原文的摘要和简介 四、Stable Diffusion 4.1、组成模块 4.2、感知压缩 4.3、条件控制 五、图解 Stable Diffusion 5.1、潜在空间的扩散 5.2、条件控制 5.3、采样 5.4、Diffusion Model 与 Stable Diffusion …

win11+wsl+ubuntu20.04+ros+x11+mobaxterm实现win11中ROS使用(含可视化)

前言 为实现在win11中使用ros… 一、win11中wsl(ubuntu20.04)安装 参考&#xff1a;Windows 11 安装 WSL2 主要步骤&#xff1a;开启虚拟化–>安装ubuntu20.04 安装后可能还是WSL1&#xff0c;可参考WSL1升级为WSL2进行升级。 二、使用鱼香ROS换源并更新 wget http://fishro…

【刷题记录】详谈设计循环队列

下题目为个人的刷题记录&#xff0c;在本节博客中我将详细谈论设计循环队列的思路&#xff0c;并给出代码&#xff0c;有需要借鉴即可。 题目&#xff1a;LINK 循环队列是线性表吗&#xff1f;或者说循环队列是线性结构吗&#xff1f; 对于这个问题&#xff0c;我们来看一下线…

Awesome-Backbones-main——alexnet模型分析

AlexNet作为骨干网络相对较老&#xff0c;可能在复杂数据集上的表现不如一些最新的深度网络结构&#xff0c;如ResNet、EfficientNet等&#xff0c;学习率调整策略中采用了阶梯式学习率更新器&#xff0c;可能并不总是适合所有数据集和模型&#xff0c;需要根据具体情况调整学习…

有名信号量、网络协议模型、UDP编程发送端

我要成为嵌入式高手之3月5日Linux高编第十五天&#xff01;&#xff01; ______________________________________________________ 学习笔记 有名信号量 1、创建semget #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(…

JVM 的垃圾回收机制以及垃圾回收算法的详解

目录 1、JVM 的垃圾回收机制 2、识别垃圾 2.1、引用计数 2.2、可达性分析 3、垃圾回收算法 3.1、标记-清除 3.2、复制算法 3.3、标记-整理 4、分代回收 1、JVM 的垃圾回收机制 对于&#xfeff;程序计数器&#xfeff;、&#xfeff;虚拟机栈&#xfeff;、&#xfe…

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…

VMware Workstation17虚拟机安装

文章目录 一.下载安装软件二.安装过程选项三.序列化四.检查是否安装成功 一.下载安装软件 方式一&#xff1a;官网下载 方式二: 网盘下载(从官网里面下载的正版) 二.安装过程选项 双击下载的安装包&#xff0c;按以下图片选项进行安装 如果没有以下图片的"升级"选…