算法基础课-数据结构

单链表

题目链接: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.mzph.cn/news/653756.shtml

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

相关文章

JVM系列——垃圾收集器

对象存活判断 引用计数法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 可达性分析算法 通过一系列称为“GC …

基于springboot+微信小程序+vue实现的校园二手商城项目源码

介绍 校园二手商城&#xff0c;架构&#xff1a;springboot微信小程序vue 软件架构 软件架构说明 系统截图 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0c;使用…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到&#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册&#xff0c;我只截出重点部分 总结&#xff1a;数据在上升沿写出&#xff0c;下降沿读入&#xff0c;…

QGIS使用地理配准将3857坐标系转成上海城建坐标

控制点格式 如 mapX mapY sourceX sourceY enable dX dY residual -58653 70641 13452659.39 3746386.025 1 0 0 0 -58653 65641 13452693.09 3740477.283 1 0 0 0 ......保存为.points格式 图层预处理 图层投影为3857坐标系 地理配准 1. 打开图层-地理配准 工具 2. 导入…

基于FX构建大型Golang应用

Uber开源的FX可以帮助Go应用解耦依赖&#xff0c;实现更好的代码复用。原文: How to build large Golang applications using FX 构建复杂的Go应用程序可能会引入很多耦合 Golang是一种流行编程语言&#xff0c;功能强大&#xff0c;但人们还是会发现在处理依赖关系的同时组织大…

sql注入第一关

判断注入点的类型 通常 Sql 注入漏洞分为 2 种类型&#xff1a; 数字型字符型 数字型测试 在参数后面加上单引号,比如: http://xxx/abc.php?id1 如果页面返回错误&#xff0c;则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 如果未报错&…

Go语言中的HTTP代理处理机制

在当今的互联网世界&#xff0c;HTTP代理是一种常见的网络通信方式&#xff0c;用于保护用户的隐私、突破网络限制或提高网络访问速度。在Go语言中&#xff0c;代理处理机制的实现可以为开发者提供强大的网络通信能力。本文将深入探讨Go语言中的HTTP代理处理机制。 首先&#…

每日一道面试题:Java中序列化与反序列化

写在开头 哈喽大家好&#xff0c;在高铁上码字的感觉是真不爽啊&#xff0c;小桌板又拥挤&#xff0c;旁边的小朋友也比较的吵闹&#xff0c;影响思绪&#xff0c;但这丝毫不影响咱学习的劲头&#xff01;哈哈哈&#xff0c;在这喧哗的车厢中&#xff0c;思考着这样的一个问题…

PrimeFaces修改默认加载动画

Background 默认加载动画不够醒目&#xff0c;我们可以在网上下载个好看的gif图&#xff0c;然后修改默认设置&#xff0c;具体步骤如下参考官方地址&#xff1a;https://www.primefaces.org/showcase/ui/ajax/status.xhtml 实现效果如下 xhtml源码 <p:ajaxStatus onstar…

【人工智能】八数码问题的A*搜索算法实现

一、实验要求 熟悉和掌握启发式搜索的定义、估价函数和算法过程&#xff0c;并利用A*算法求解八数码问题&#xff0c;理解求解流程和搜索顺序 二、实验原理 定义h*(n)为状态n到目的状态的最优路径的代价&#xff0c;则当A搜索算法的启发函数h(n)小于等于h* (n)&#xff0c;即满…

使用毫米波雷达传感器的功能安全兼容系统设计指南2(TI文档)

2.3 步骤3&#xff1a;平台选择 平台选择是设计生命周期中最关键的步骤之一。一旦从第二步完成了一个成熟的系统框图&#xff0c;重要的任务就是根据性能需求选择系统模块/子系统。TI广泛的毫米波雷达传感器产品组合可以帮助实现许多性能要求&#xff0c;如远程或中程、角度分辨…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构&#xff0c;于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度&#xff0c;又在横向上拥有“宽度”&#xff0c;并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0&#xff0c;Echarts 4 升级到 5后&#xff0c;有了很大改变&#xff0c;新的配置项4是无法兼容的&#xff0c;所以想要使用新的功能&#xff0c;都需要升级&#xff01; 新建一个echarts.js文件 layui.define(function (exports) {// 这…

2023年算法OOA-CNN-BiLSTM-ATTENTION回归预测(matlab)

OOA-CNN-BiLSTM-Attention鲸鱼算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕…

Nodejs前端学习Day5

苦其心志&#xff0c;劳其筋骨 文章目录 前言一、处理路径问题二、path路径模块总结 前言 继续fs 一、处理路径问题 在使用fs模块操作文件时&#xff0c;如果提供的操作路径是以./或…/开头的相对路径时&#xff0c;很容易出现路径动态拼接错误的问题 原因&#xff1a;代码在…

USB-C显示器:未来显示技术的革新者

随着科技的不断发展&#xff0c;显示技术也在不断进步&#xff0c;而USB-C显示器作为最新的显示技术&#xff0c;正在引领着显示行业的发展潮流。USB-C显示器具有许多优点&#xff0c;如高速传输、便捷连接、节能环保等&#xff0c;使其成为未来显示技术的革新者。 一、USB-C显…

【leetcode】01背包总结

01 背包 关键点 容器容量固定每件物品只有两种状态&#xff1a;不选、选 1 件求最大价值 代码 int N, W; // N件物品&#xff0c;容量为W int w[N], v[N]; // w为大小&#xff0c;v为容量/* 数组定义 */ int[][] dp new int[N][W 1]; // 注意是W 1, 因为重量会取到W dp[…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

小型洗衣机哪个牌子好用又耐用?最好用的迷你洗衣机推荐

最近这两年在洗衣机中火出圈的内衣洗衣机&#xff0c;它不仅可以清洁我们较难清洗的衣物&#xff0c;自带除菌功能&#xff0c;可以让衣物上的细菌&#xff0c;还能在清洗的过程中呵护我们衣物的面料&#xff0c;虽然说它是内衣洗衣机&#xff0c;它的功能不止可以清洗内衣&…

精通Python第16篇—深入解析Pyecharts极坐标系参数与实战

文章目录 Pyecharts绘制多种炫酷极坐标系参数说明与方向的技术博客1. 导入必要的库2. 极坐标系基础3. 定制化极坐标系4. 方向性的极坐标系5. 极坐标系的动画效果6. 自定义极坐标轴标签7. 添加极坐标系的背景图8. 极坐标系的雷达图总结 Pyecharts绘制多种炫酷极坐标系参数说明与…