
算法与数据结构(含题)
介绍算法与数据结构相关知识
ZZZWWWFFF_
这个作者很懒,什么都没留下…
展开
-
[蓝桥杯 2019 省 AB] 完全二叉树的权值
【代码】[蓝桥杯 2019 省 AB] 完全二叉树的权值。原创 2023-01-13 17:16:35 · 294 阅读 · 0 评论 -
B. DS双向链表—祖玛
该题考察数据结构双向链表的使用,双向链表与普通单链表的区别只在于各个结点还包含一个指针用来指向前一个结点,思路上也比较容易想到,我们发射祖玛后(即插入结点到链表中),需要检查新链表能否被消除,如果可以消除则消除,消除后还需再检查能否继续消除,不能消除则继续“发射祖玛”下面是代码,具体步骤已经写在注释里了。原创 2022-10-06 19:23:09 · 690 阅读 · 0 评论 -
A. DS循环链表—约瑟夫环(Ver. I - A)
该题主要考察数据结构循环链表的使用,在定义循环链表时,与普通单链表的定义不同的是,我们需要让尾结点指向头结点(不是head),这里需要用到的还有循环链表的删除操作,这也有与单链表不同的地方,我们需要特殊考虑//分为当链表中只有一个元素时,删除链表第一个结点(不是头结点),删除链表尾结点,其他情况,否则会出现丢失head的情况。原创 2022-10-06 18:52:01 · 1012 阅读 · 0 评论 -
D. DS线性表—多项式运算
【代码】D. DS线性表—多项式运算。原创 2022-10-05 19:29:34 · 698 阅读 · 0 评论 -
E. DS单链表—删除重复元素
该题较为简单,只需使用嵌套的for循环即可。原创 2022-09-24 14:52:22 · 771 阅读 · 0 评论 -
DS单链表--合并
该题考察链表的基本操作——合并链表。原创 2022-09-24 14:47:38 · 564 阅读 · 0 评论 -
B. DS单链表--结点交换
如图原本的走向是caebdf,通过改变指针的指向后我们便实现了交换a和b。注意这里的交换不能只是简单的交换数值。原创 2022-09-24 12:35:59 · 340 阅读 · 0 评论 -
A. DS单链表--类实现
该题主要考察对 单链表的基本定义与操作,较为简单。原创 2022-09-24 12:23:59 · 166 阅读 · 0 评论 -
D. DS链表—学生宿舍管理
【代码】D. DS链表—学生宿舍管理。原创 2022-09-24 12:19:47 · 244 阅读 · 0 评论 -
B. DS顺序表--连续操作
【代码】B. DS顺序表--连续操作。原创 2022-09-18 11:16:30 · 230 阅读 · 0 评论 -
C. DS顺序表--合并操作
【代码】C. DS顺序表--合并操作。原创 2022-09-18 11:12:51 · 543 阅读 · 0 评论 -
D. DS顺序表之循环移位
【代码】D. DS顺序表之循环移位。原创 2022-09-18 11:06:56 · 261 阅读 · 0 评论 -
A. DS顺序表--类实现
【代码】A. DS顺序表--类实现。原创 2022-09-17 15:43:42 · 123 阅读 · 0 评论 -
BFS(广度优先搜索算法)入门
/** * 广度优先搜索 * @param Vs 起点 * @param Vd 终点 */ bool BFS(Node& Vs, Node& Vd){ queue<node> Q; Node Vn, Vw; int i; //初始状态将起点放进队列Q Q.push(Vs); hash(Vw) = true;//设置节点已经访问过了! while (!Q.empt.原创 2022-03-02 20:15:15 · 664 阅读 · 0 评论 -
DFS(深度优先搜索算法)入门
首先在开始我们的学习之前,我们需要读者拥有递归的知识基础并且在学习之前,我先给出BFS的基本代码模型(基本大部分DFS题目都能按照此模型来写)void dfs(int step){ 判断边界 尝试每一种可能 for(i=1;i<=n;i++){ 继续下一步 dfs(step+1) } 返回}下面开始我们的学习导入首先介绍一下DFS所谓的DFS在我看来就是一条路走到黑,直到无路可走的情况下,才会选择回头,然后重新选择一条路(官方说法即“优先考虑深度”)引导原创 2022-02-20 20:37:28 · 1320 阅读 · 0 评论 -
图解Dijkstra算法(单源最短路径)
注意这里这段话的理解,我们选择了距离源点最近的点之后,必然不可能再找到比它离源点还近的点了,例如我们找到距离源点最近的点距离是1,那么我们要想通过“中间点”找到比它还小的距离是不可能的,因为单凭这个1就是最小的了,何况我们还要加上另外一段距离#include<algorithm>#include<iostream>using namespace std;int main(){ int e[10][10], dis[10], book[10...原创 2022-05-15 19:04:54 · 248 阅读 · 0 评论 -
图解 Floyd算法(多源最短路径)
如图,小明准备去一些城市旅游,其中有些城市之间有公路,有些则没有,小明为了节省路费,请你帮他计算任意两个城市之间的最短路径for (int i = 1; i <= n; i++){ for (int j = 1; j <= n; j++) { e[i][j] = min(e[i][j], e[i][1] + e[1][j]); }}for (int i = 1; i <= n; i++)//经过1号顶点{ for (in...原创 2022-05-14 16:14:24 · 251 阅读 · 0 评论 -
使括号有效的最少添加(栈/平衡法)
该题与前面做过的题很相似有效的括号(栈)_ZZZWWWFFF_的博客-优快云博客对了该题题目看起来有些复杂,我仔细读了一遍发现这不就是“求没匹配上的括号有多少个”吗??思路:我们遇到左括号就入栈,遇到右括号便与栈顶的元素匹配(注意此时要判断是否栈空),否则就继续入栈class Solution {public://求没匹配上的括号有多少个 char getleft(char r) { return '('; } int minA...原创 2022-05-01 16:34:50 · 355 阅读 · 0 评论 -
有效的括号(栈)
我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们不难想到该题可以使用数据结构栈所以我们可以将这个左括号放入栈顶当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回False 否则继续入栈,最后判断是否所有的括号都被消除了即可(即判断是否栈空)代码实现如...原创 2022-05-01 16:02:47 · 270 阅读 · 0 评论 -
在未排序情况下移除重复结点(book记录/嵌套循环)
在之前我们曾经做过一道与该题近乎一模一样的题目,不过不同的是,该题所给的链表并未排序过像这种去除重复元素的题目,其实以前在学习C语言数组的时候也做过类似的,我们常用的解法是使用嵌套循环,即一个结点作为标准,另外一个结点参照该标准,如果两个结点的val相同,我们就去除该结点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * List..原创 2022-03-25 21:19:37 · 1247 阅读 · 0 评论 -
环形链表(循环赋值/双指针)
首先,题意很明确,给你一个链表头结点,判断这个链表是不是环链表其实在题目中,我们便可以得到我们的第一思路了,“如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环”,我们根据这句话来写我们直接遍历这个链表即可,且每经过一个结点我们就对其赋值(注意要赋本题数据范围以外的数据,所以我们赋100001),那么如果是环链表,我们就必然还会遍历到100001这个数字,根据能否找到这个数字来判断是不是环链表即可!!!/** * Definition for singly-...原创 2022-03-25 20:37:25 · 1939 阅读 · 0 评论 -
相交链表(双指针/嵌套for)
该题你咋一看题目还挺长,实际上题目就一个意思,给你两个链表的结点,找到它们的相交结点,并且返回该结点该题我思来想去,只想到一种办法——嵌套for循环(我知道效率很低)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */cla...原创 2022-03-24 21:14:03 · 549 阅读 · 0 评论 -
删除排序链表中的重复元素(迭代)
该题我也是大意了,一开始没有认真审题,没有看到给的链表是排好序的!!!给的链表是排好序的意味着:所有链表中重复出现的元素都挨在一起!!!那么我们只需遍历链表遇到一个结点与下一个结点相同的情况就直接将该结点连到下下个结点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nu...原创 2022-03-24 20:24:31 · 701 阅读 · 0 评论 -
链表中倒数第k个结点(顺序查找/快慢指针)
该题思路上最容易想到的应该是顺序查找了,这也是我的第一思路我们只需要先遍历链表,计算结点数量,最后遍历链表,遇到第n-k+1个结点时break,最后return即可(这里n代表链表结点总数)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };..原创 2022-03-24 17:18:15 · 1366 阅读 · 0 评论 -
从尾到头打印链表(使用库reverse/栈/就地迭代)
该题比较简单,实现的方法也很多,下面将一一介绍1.使用vector函数reverse这个思路也是我的第一思路,毕竟我知道有vector的reverse这个函数,我们就直接把链表中各个结点的val push_back到数组中,再使用reverse即可/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNo...原创 2022-03-23 21:01:22 · 613 阅读 · 0 评论 -
合并两个有序列表(双指针)
相信做过“合并两个有序数组”这样操作的同学这题应该没有问题我们的想法主要是建立一个新的链表来存储合并后的链表,我们同时遍历两个链表,一个一个对应去比较,每次都选那个结点值小的,然后没选到的结点不动(等着参加下一次比较),被选到的就向前走一步,这样一直循环比较直到有一个链表走完了,我们就break最后把那个没走完的链表直接拼在后面即可/** * Definition for singly-linked list. * struct ListNode { * int val;...原创 2022-03-22 20:11:09 · 628 阅读 · 0 评论 -
回文链表(快慢指针/转数组/转string)
该题思路上最容易想到的还是我们将这些结点的值全部填到一个数组或者一个string里面去,之后按照之前所学的判断是否是回文串的方法来做即可/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), nex..原创 2022-03-22 19:39:16 · 205 阅读 · 0 评论 -
二进制链表转整数(栈/直接遍历/位运算)
该题最容易想到的思路就是直接模拟我们在遇到一个二进制数将它转换成十进制数的过程/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListN...原创 2022-03-22 16:32:01 · 650 阅读 · 0 评论 -
链表的中间结点(快慢指针/空间换时间/单指针)
该题属于简单题思路上,最容易想到的应该是单指针了即我们先使用一个指针去遍历链表看有多少个结点,再根据题目要求,得到我们的目标(即哪个结点),最后再遍历一次链表,到了目标结点,就return或者break即可/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) ..原创 2022-03-21 22:36:24 · 509 阅读 · 0 评论 -
删除链表中的元素(脑筋急转弯)
该题在LeetCode上面中文翻译可能有出入,所以这里采用英文,题意简单来说就是只给你一个单链表的那个待删除结点,不给你头结点,达到“删除”的效果我们正常的删除结点的思维是这样这样的话,我们就必然需要使用到head来遍历链表,但是这题不允许使用实际上,我们可以这样,我们将待删除结点的值改变为下一个结点的值同时,我们将待删除结点(此时值已经改变)的next连到下下个结点(注意这里现在的待删除结点与其下一个结点值一致)这样的操作实际上是一种“复制”,例如,在上面这个图中,我们...原创 2022-03-21 15:50:10 · 530 阅读 · 0 评论 -
反转链表(迭代/双指针)
我们要想反转链表,我想的是从最后一个元素开始把每个元素指向它的下一个元素,即一个一个改变元素的指向/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} *...原创 2022-03-21 15:23:07 · 522 阅读 · 0 评论 -
移除链表元素(双指针/虚拟头指针)
该题属于链表的简单题,只是简单的删除结点,在链表结构实现_ZZZWWWFFF_的博客-优快云博客这篇文章里面我已经作了详解,具体操作如下主要我们需要注意一些特殊情况的讨论比如头结点元素就是我们要删除的、以及全部元素都要删除的情况具体代码实现如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode()...原创 2022-03-20 20:20:54 · 154 阅读 · 0 评论 -
链表结构实现
通过一个含有自身结构的指针,我们可以实现随机分布的结构变量的遍历对于以下结构struct list{ char name[20]; list * pn;};name成员含有结构中的某些信息,pn成员是指向另一个list的指针,这种结点(结构的实例)通过每个list的pn成员链接起来,能用于构造任意长的结构链,这样的结构链即被称为链表。链表中的每一个list结构变量称为结点链表中的第一个list结点通常由一个指向list的指针引导,这个结构指针(称为链首指针)不是自身结构成员,但它指原创 2022-03-20 11:37:04 · 799 阅读 · 2 评论 -
【算法与数据结构】—— 并查集
目录1. 概论2. 并查集的现实意义3. find( )函数的定义与实现4. join( )函数的定义与实现5. 路径压缩算法之一(优化find( )函数)实战检验首先在开始我们学习并查集之前呢,我想先请读者看一下这篇文章点击进入并查集详解 ——图文解说,简单易懂,理解一下并查集的基础理论知识,也算是铺垫吧1. 概论定义:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是..转载 2022-03-13 23:00:27 · 344 阅读 · 0 评论 -
认识“复杂度”
目录一、什么是时间复杂度和空间复杂度?1.算法效率2.时间复杂度的概念3.空间复杂度的概念4.复杂度计算在算法的意义二、如何计算常见算法的时间复杂度?推导大O阶方法复杂度对比三、典型复杂度要求的算法题练习实例1实例3实例4实例5:二分查找实例6:单路递归实例7:多路递归斐波那契数列递归:一、什么是时间复杂度和空间复杂度?1.算法效率算法效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复...转载 2022-03-05 14:33:05 · 746 阅读 · 0 评论