算法基础课-数据结构

单链表

题目链接:826. 单链表 - AcWing题库
思路:AcWing 826. 单链表---图解 - AcWing

需要注意的点在于理解ne[idx] = head,idx表示当前的点,意思是将当前的点链到头结点的后面,再将头结点链在当前idx的前面。

#include<bits/stdc++.h>using namespace std;
const int N = 100010;
int head, e[N], ne[N], idx;// 初始化
void init()
{head = -1;idx = 0;
}// 在链表头插入一个数a
void insert_to_head(int a)
{e[idx] = a;ne[idx] = head;head = idx ++ ;
}void insert(int k,int a)
{e[idx] = a;ne[idx] = ne[k];ne[k] = idx ++ ;
}// 将头结点删除,需要保证头结点存在
void remove(int k)
{ne[k] = ne[ne[k]];
}int main(){int m;cin>>m;init();while(m--){char a;cin>>a;int k,x;if(a=='H'){cin>>x;insert_to_head(x);}else if(a=='I'){cin>>k>>x;insert(k-1,x);}else{cin>>k;if(!k) head = ne[head];else remove(k-1);}}for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";return 0;
}

双链表

题目链接:827. 双链表 - AcWing题库

思路:这个博客写的可好AcWing 827. 双链表 - AcWing。

需要注意的地方在于r数组和l数组的含义。r[idx]表示的是idx的右边,l[idx]表示idx的左边,开始时初始化0的左边是1,1的右边是左,所以r[0] = 1,l[1] = 0。

#include<bits/stdc++.h>using namespace std;const int N = 100010;int e[N], l[N], r[N], idx;// 初始化
void init()
{//0是左端点,1是右端点r[0] = 1, l[1] = 0;idx = 2;
}// 在节点a的右边插入一个数x
void insert(int a, int x)
{e[idx] = x;l[idx] = a, r[idx] = r[a];l[r[a]] = idx, r[a] = idx ++ ;
}// 删除节点a
void remove(int a)
{l[r[a]] = l[a];r[l[a]] = r[a];
}int main(){int m;cin>>m;init();while(m--){string op;cin>>op;int k,x;if(op[0] == 'L'){cin>>x;insert(0,x);}else if(op[0] == 'R'){cin>>x;insert(l[1],x);}else if(op[0] == 'D'){cin>>k;remove(k+1);}else if(op[1] == 'L'){cin>>k>>x;insert(l[k+1],x);}else{cin>>k>>x;insert(k+1,x);}}for(int i=r[0];i!=1;i=r[i]){cout<<e[i]<<" ";}return 0;
}

栈的应用

题目链接:3302. 表达式求值 - AcWing题库
思路:这个题解写的很好AcWing 3302. 表达式求值:多图讲解运算符优先级+详细代码注释 - AcWing。

主要的思路在符号栈上,符号栈内存储的符号优先级一定递增,即将进来的符号若小于当前栈顶优先级,则先对栈内高优先级符号进行运算,直到栈顶优先级低于待入栈符号优先级。

还需要注意的是,对于相同运算符来说,栈内的优先级大于栈外优先级,即遇到栈顶是一个加号,待入栈也是一个加号,先运算栈内加号,当栈为空或遇到更低优先级的符号时再将栈外加号入栈。

#include<bits/stdc++.h>using namespace std;
stack<int> num;
stack<int> op;unordered_map<char,int> h{{'+',1},{'-',1},{'*',2},{'/',2}};
void calc(){char ops = op.top();op.pop();int b = num.top();num.pop();int a = num.top();num.pop();if(ops == '+') num.push(a+b);if(ops == '-') num.push(a-b);if(ops == '*') num.push(a*b);if(ops == '/') num.push(a/b);return;
}int main(){string s;cin>>s;for(int i=0;i<s.size();i++){if(isdigit(s[i])){  //遇到数字的情况int j = i;int val = 0;while(j<s.size()&&isdigit(s[j])){val = val*10 + s[j] - '0';j++;}i=j-1;num.push(val);}else{  //遇到字符的情况if(s[i] == '(') op.push('(');else if(s[i] == ')'){while(op.top()!='('){calc();}op.pop();}else{while(op.size() && h[op.top()] >= h[s[i]]){calc();}op.push(s[i]);}}}while(op.size())calc();cout<<num.top()<<endl;return 0;
}

单调栈

题目链接:830. 单调栈 - AcWing题库

思路:维护一个数字单调递增的栈,若下一个待入栈数字小于栈顶时,持续出栈。感觉跟表达式求值中栈内优先级高于栈外优先级有点像,hh。

常见模型:找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{while (tt && check(stk[tt], i)) tt -- ;stk[ ++ tt] = i;
}
#include<bits/stdc++.h>using namespace std;
const int N = 100010;
int a[N];
int main(){int n;cin>>n;stack<int> stk;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){while(stk.size()&&stk.top() >= a[i]) stk.pop();if(stk.size()) cout<<stk.top()<<" ";else cout<<-1<<" ";stk.push(a[i]);}return 0;
}

单调队列

题目链接:154. 滑动窗口 - AcWing题库
思路:排在后面的数字越小/大,越优秀,当这样的元素出现时,将右侧队列中的元素出队。由于要求队列能右侧出队,所以需要自己模拟队列(感觉可以使用双端队列实现)。

需要注意的点是队列中存储的是下标,是为了方便队头出队。

#include<bits/stdc++.h>using namespace std;
const int N = 1e6+10;int a[N];
int q[N];
int main(){int n,k;cin>>n>>k;for(int i=0;i<n;i++) cin>>a[i];int h=1,t=0;for(int i=0;i<n;i++){while(h<=t&&a[q[t]] >= a[i]) t--;q[++t] = i;if(q[h]<i-k+1) h++;if(i>=k-1) cout<<a[q[h]]<<" ";}h=1;t=0;cout<<endl;for(int i=0;i<n;i++){while(h<=t&&a[q[t]] <= a[i]) t--;q[++t] = i;if(q[h]<i-k+1) h++;if(i>=k-1) cout<<a[q[h]]<<" ";}return 0;
}

KMP

题目链接:831. KMP字符串 - AcWing题库

思路:对于模板串(短串)进行初始化ne数组,ne数组表示当前位置不匹配时,可以从哪个位置开始匹配。具体思路太复杂,放弃,可以考虑直接背过。时间复杂度为O(m+n)。

#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;
const int M = 1e6+10;
char p[N],s[M];
int ne[M];
void init(char p[],int n,int m){// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度for (int i = 2, j = 0; i <= n; i ++ ){while (j && p[i] != p[j + 1]) j = ne[j];if (p[i] == p[j + 1]) j ++ ;ne[i] = j;}
}int main(){int n,m;cin>>n;cin>>p+1;cin>>m;cin>>s+1;init(p,n,m);// 匹配for (int i = 1, j = 0; i <= m ;i ++ ){while (j && s[i] != p[j + 1]) j = ne[j];if (s[i] == p[j + 1]) j ++ ;if (j == n){cout<<i-n<<' ';j = ne[j];// 匹配成功后的逻辑}}return 0;
}

Trie(字典树)

题目链接:835. Trie字符串统计 - AcWing题库
思路:ch[0][2]=1表示从0号结点开始往2('c')走能走到1号节点。

#include<bits/stdc++.h>using namespace std;
const int N = 100010;
int son[N][26],cnt[N],idx = 1;void insert(string s){int p = 0;for(int i=0;i<s.size();i++){int u = s[i] - 'a';if(!son[p][u]) son[p][u] = idx++;p = son[p][u];}cnt[p]++;
}int query(string s){int p = 0;for(int i=0;i<s.size();i++){int u = s[i] - 'a';if(!son[p][u]) return 0;p = son[p][u];}return cnt[p];
}int main(){int n;cin>>n;while(n--){char op;string s;cin>>op>>s;if(op == 'I'){insert(s);}else cout<<query(s)<<endl;}return 0;
}

并查集

题目链接:836. 合并集合 - AcWing题库

思路:fa[i]表示i节点的父亲节点。开始时每个节点的父亲节点都是自己。

#include<bits/stdc++.h>using namespace std;
const int N= 1e5+10;int fa[N];  //下标表示当前点,数组值表示其父亲节点的下标int find(int x){if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}void unionset(int x,int y){fa[find(x)] = find(y); 
}int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++) fa[i] = i;while(m--){char op;cin>>op;int x,y;cin>>x>>y;if(op == 'M'){unionset(x,y);}else{if(find(x) == find(y)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}}return 0;
}

题目链接:838. 堆排序 - AcWing题库

思路:主要的操作包括up和down,up表示将节点上移,一般在新节点进入时使用,down表示将节点下移,一般在删除元素时使用。

需要注意的点在于一些小细节,例如递归边界,up和down都使用递归的形式,需要注意什么时候递归停止或是什么时候采用递归。

#include<bits/stdc++.h>using namespace std;
const int N = 100010;
int a[N];
int cnt;
void up(int x){if(x/2&&a[x]<a[x/2]){swap(a[x],a[x/2]);up(x/2);}
}void down(int x){int u = x;if(x*2<=cnt&&a[u]>a[x*2]) u = x*2;if(x*2+1<=cnt&&a[u]>a[x*2+1]) u = x*2+1;if(x!=u){swap(a[x],a[u]);down(u);}
}int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++) {cin>>a[++cnt];up(cnt);}// for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";// cout<<endl;while(m--){cout<<a[1]<<" ";swap(a[1],a[cnt]);cnt--;down(1);// for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";// cout<<endl;}return 0;
}

哈希表

题目链接:841. 字符串哈希 - AcWing题库

思路:

#include<bits/stdc++.h>using namespace std;
const int N = 100010;
typedef unsigned long long ULL;
ULL h[N],p[N];
int P = 131;
ULL getSeg(int l,int r){return h[r] - h[l-1] * p[r-l+1];
}
int main(){int n,m;cin>>n>>m;char s[N];cin>>s+1;p[0] = 1;for(int i=1;i<=n;i++){h[i] = h[i-1]*P + s[i];p[i] = p[i-1]*P;}while(m--){int l1,l2,r1,r2;cin>>l1>>r1>>l2>>r2;if(getSeg(l1,r1) == getSeg(l2,r2)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

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

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

相关文章

Qt|大小端数据转换

后面打算写Qt关于网络编程的博客&#xff0c;网络编程就绕不开字节流数据传输&#xff0c;字节流数据的传输一般是根据协议来定义对应的报文该如何组包&#xff0c;那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料&#xff1a;大小端模…

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解&#xff0c;我们常用的Git客户端是SourceTree&#xff0c;配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异&#xff0c;以下是SourceTre…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法&#xff0c;全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果&#xff0c;是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…

【AcWing第140场周赛】AcWing 5461. 判断序列(A题)

文章目录 一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 一、题目 1、原题链接 5461. 判断序列 2、题目描述 二、解题报告 1、思路分析 按照题目要求模拟即可。具体过程&#xff1a;设置一个变量来记录是否满足题目要求&#xff0c;检查…

虹科分享丨汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

来源&#xff1a;艾特保IT 虹科分享丨汽车技术的未来&#xff1a;Netropy如何测试和确保汽车以太网的性能 原文链接&#xff1a;https://mp.weixin.qq.com/s/G8wihrzqpJJOx5i0o63fkA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #汽车以太网 #车载网络 #Netropy …

SpringBoot常见错误

SpringBoot常见错误 1、SpringBoot启动时报错 错误: 找不到或无法加载主类 com.xxx.xxx.Application springboot启动时报错错误&#xff1a;找不到或无法加载主类 com.xxx.xxx.Application。 解决方法就是打开idea的控制台&#xff0c;输入以下三行命令&#xff1a; mvn cl…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…

2024.1.25 C++QT 作业

思维导图 练习题 1. 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void sh…

社交巨头之争:Facebook如何保持领先地位

社交媒体领域一直是激烈的竞争场地&#xff0c;而在这场竞争中&#xff0c;Facebook一直屹立不倒&#xff0c;保持着领先地位。究竟是什么让这个社交巨头在激烈的竞争中屡屡脱颖而出呢&#xff1f;本文将深入剖析&#xff0c;揭示Facebook如何通过创新、数据驱动、社会责任等关…

flink-java使用介绍,flink,java,DataStream API,DataSet API,ETL,设置 jobname

1、环境准备 文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/ 仓库&#xff1a;https://github.com/apache/flink 下载&#xff1a;https://flink.apache.org/zh/downloads/ 下载指定版本&#xff1a;https://archive.apache.org/dist/flink…

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…

2023年深圳市节假日人口迁入数据,shp/excel格式,需要自取!

基本信息. 数据名称: 深圳市节假日人口迁入数据 数据格式: Shp、excel 数据时间: 2023年国庆节 数据几何类型: 线 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1a0928迁入人口占迁入深圳市人口的比值&#xff0…

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块&#xff0c;能够在强大的拓扑结构中提供高性能无线串行通信&#xff0c;如点对点、点对多点和安全 Mesh&#xff08;P840 不提供 Mesh&#xff09;。 它采用跳…

Unity——八叉树的原理与实现

八叉树原理 八叉树&#xff08;Octree&#xff09;是一种用于在三维空间中进行空间分割的数据结构。它将三维空间递归地划分为八个子空间&#xff0c;每个子空间对应于一个八叉树节点。这种分割方式可以有效地组织和管理场景中的对象&#xff0c;提高检索效率&#xff0c;特别…

python笔记10

1、继承 继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用父类的代码&#xff0c;并且有机会添加新的属性和方法&#xff0c;或者重写父类的…

Git 教程 | 将本地修改后的文件推送到 Github 指定远程分支上

Git 是一种分布式版本控制系统&#xff0c;用于敏捷高效地处理任何大小的项目。它是由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开源版本控制软件。Git 的本地克隆就是一个完整的版本控制存储库&#xff0c;无论脱机还是远程都能轻松工作。开发人员会在本地提交其工…

[嵌入式系统-5]:龙芯1B 开发学习套件 -2- LoongIDE 集成开发环境集成开发环境的安装步骤

目录 一、LoongIDE&#xff08;龙芯开发工具集成环境&#xff09;概述 1.1 概述 二、软件开发环境的安装过程 2.0 注意事项 2.1 步骤1&#xff1a;MingW运行环境 2.2 步骤2&#xff1a;安装LoongIDE 2.3 步骤3&#xff1a;安装MIPS工具链 2.4 配置工具链 2.5 重启电脑…

Bytebase 签约 Aptive,助力北美商住害虫控制服务领导者构建统一数据库操作平台

在数字化快速发展时代&#xff0c;有效的规范数据库管理对企业安全运营至关重要。近日&#xff0c;数据库 DevOps 团队协同管理工具 Bytebase 签约北美商住害虫控制服务的领导者 Aptive Environmental&#xff0c;旨在全面优化 Aptive Environmental 的数据库操作管理&#xff…

天软特色因子看板 (2024.01 第10期)

该因子看板跟踪天软特色因子A04001(当日趋势强度)&#xff0c;该因子为反映股价走势趋势强弱&#xff0c;用以反映股价走势趋势强弱&#xff0c;abs(值)越接近1&#xff0c;趋势 性越强&#xff0c;符号代表涨跌方向。 今日为该因子跟踪第10期&#xff0c;跟踪其在SW801120 (申…