数据结构与算法
文章平均质量分 76
专栏用于学习算法的一些基本的思想,也包含一些算法的使用技巧,亦可以作为资料进行查阅。注重算法的逻辑思想,并且一次来锻炼写程序的逻辑思维能力。
Cooku Black
这个作者很懒,什么都没留下…
展开
-
935.骑士拨号器 - 力扣
读完题目之后,一个很简单的思路就是模拟,使用暴力的方式来模拟这一过程,最初我是用的是深度优先搜索算法进行暴力求解,但是回出现栈溢出的情况,在输入。的时候,电脑内存爆满,导致电脑卡死,而后重启得以恢复。因此需要想出一个更加高效的方法,另一个思路就是——动态规划算法,我们可以定义。数组,将其都存储进去,然后在循环的时候进行遍历这个数组,表示每个值能从那个位置移动而来,,那么每一个数字都只不能移动,所以长度为1的每一个数字的值都为。进行动态规划结束后,我们得到的是以每一个数字结尾的长度为。原创 2024-06-26 20:18:31 · 891 阅读 · 0 评论 -
蓝桥杯 — — 完全日期
为了更快的知道这个求和出来的值是否是一个完全平方数,我们可以使用一个哈希表将这些值的完全平方数进行存储下来,这样每次查找的时间就变为了。,然后再判断每一个数是否是一个合法的日期,如果这个日期是合法的,接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数即可。因为对于给定范围的年份,其范围是有限的,对于这道题给出的日期一共有。的平方进行标记,表示该范围内的所有完全平方数。我们可以在每次判断是闰年的时候将数组中。位数,也就是说每个位置上的数最大取的是。,对应的所有位置最大值的和是。原创 2024-04-16 20:30:11 · 670 阅读 · 0 评论 -
蓝桥杯 — — 纯质数
开始进行遍历,遍历到的每一个数,如果是质数,我们都将其进行添加到数组中,接着对数组中已经记录的所有质数进行乘积,如果得到的结果小于给定的范围,那么就标记这个值为合数,继续遍历下一个数,直到边界时停止。),如果需要判断单个数是否为素数,试除法是更合适的选择;一个最简单的思路就是枚举出所有的质数,然后再判断这个质数是否是一个纯质数。为一个合数,进入下一个循环,判断4不是一个质数,直接进行遍历。:对一个给定的范围,求其中的质数,我们从。,表示目前的所有数都是一个质数,然后从。),接着进入下一个循环,判断。原创 2024-04-15 20:25:19 · 1004 阅读 · 0 评论 -
蓝桥杯考前准备— — c/c++
如果我们不使用四舍五入的功能还要输出某几位数,那么我们就要自己进行设定了。例如:输出的数据是 2020-03-02,因为有前导零的存在,所以使用。如果题目中有要求规定输入数据的格式与输出数据的格式,最好使用。例如:输入的数据是 2020-02-18,则使用。直接输出其小数点后3位,并且不进行四舍五入。原创 2024-04-12 22:45:48 · 1638 阅读 · 0 评论 -
最短路径问题——(弗洛伊德算法与迪杰斯特拉算法)
接下来的m行每行输入三个数i,j,x,其中i,j分别表示边的起点和终点,x表示这条边的距离。接下来的m行每行输入三个数i,j,x,其中i,j分别表示边的起点和终点,x表示这条边的距离。第一行输入三个数n,m,q分别表示一共有n个点,m条边,q个查询。最后q行,每行输入一个数字表示查询点A到每一个点之间的最短距离。第一行输入三个数n,m,q分别表示一共有n个点,m条边,q个查询。最后q行,每行输入两个数字表示查询任意两个点之间的最短距离。原创 2024-04-12 22:28:03 · 273 阅读 · 0 评论 -
蓝桥杯— —小明的背包问题
背包容量为。原创 2024-04-12 20:14:00 · 984 阅读 · 0 评论 -
蓝桥杯 — — 数数
对于第三部分,相当于是一个查询操作,对之后最近的非质数值进行了标记,比如现在。是否为一个质数,如果是一个质数,那么这个质数只包含了它本身这一个质数,就令。,将数组p中的每一个值都与i进行相乘,如果得到的结果小于所给定的范围就令。的值为非质数值,但是这一步是一个非常巧妙的过程,我们使用了一个式子。,可以假定为初始的时候所有的值都是质数,然后我们从第一个质数。的值是否在给定的范围内,如果在给定的范围内就接着判断。了,所以4不是一个质数,程序往下执行,然后。,它一定是一个质数 ,因此它的值。原创 2024-04-12 17:47:56 · 1075 阅读 · 0 评论 -
蓝桥杯 — — RSA解密
的值非常大,我们需要用到快速幂的方法,又因为快速幂中存在乘法运算,极易导致内存溢出的现象(在很大的数的情况下),因此我们需要在快速幂的基础上使用快速乘的方法进行运算(在计算机中,计算加法的速度往往比计算乘法的速度要快),并且数值都要使用。,这就变为了求解一个二元一次方程组,对于二元一次方程组,要想求出两个未知量,我们至少需要直到两个等式关系,但是这里我们只知道了一组等式关系,因此无法使用常规的思想进行求解。的求解,我们可以使用枚举的思想,利用给出的公式。,再利用上面得到的规律,可以递归的求解出。原创 2024-04-11 22:41:48 · 1146 阅读 · 0 评论 -
蓝桥杯 — —灵能传输
友情链接:灵能传输题目大意:给出一个数组,每次选择数组中的一个数(要求不能是第一个数与最后一个数),如果这个数是一个正数,就将这个数减去自身两次,并且将相邻的两个数分别加上这个数一次,如果这个数是负数,就将这个数减去自身两次,并且将相邻的数加上这个负数两次,(本质上第二种情况与第一种情况一样,因为减去负数相当于加上这个负数的绝对值),使用公式表述为:ai−1+=ai ai+1+=ai ai−=2aia_{i - 1} += a_i ~~~~~~~~ a_{i + 1} += a原创 2024-04-11 17:38:34 · 1160 阅读 · 0 评论 -
迷宫 — — 蓝桥杯(动态规划)
的平面网格,并且每一个格子都有一定的代价,并且设有障碍物和陷阱,障碍物的意思是会在原来对应格子的基础上在加上一定的代价,陷阱的意思是如果移动到某一位置有陷阱存在,那么会自动在向右或下移动两个格子。问题求的是有多少不同路径的可能性,这道题是求最小的代价是什么,另一点不同的是这道题设定的障碍物与陷阱,而不同路径问题仅仅只设定了障碍物,并且要求有障碍物的位置不能通过(的思想,在处理输入数据的时候,将障碍物的部分的代价直接累加到原数组上去,并且开辟一个新的字符数组,用来记录那个地方有陷阱。值加上当前位置的代价值。原创 2024-04-10 22:39:57 · 1246 阅读 · 2 评论 -
进制转换问题
这就导致了映射的问题,我们需要处理每一个这样的问题,如果遇到某个位置上的值为。进行取余运算,将每一个位置得到的值存入到数组中,最后在逆序输出这个数组即可。(如果存在更高的位的话),并且在每次进行处理的时候对每一个位置上的值进行。进制数,然后映射到字母表中去,但并不是普通的映射,存在特例情况,如:在。进行取余,直到该十进制的数字结果为0结束,并且倒序输出结果。表示最高位上的值),x表示进制(如二进制转换位十进制,那么。进行取余,直到该十进制的数字结果为。进行取余,直到该十进制的数字结果为。原创 2024-04-10 20:31:53 · 791 阅读 · 0 评论 -
一文搞定所有 — — 买卖股票的最佳时机问题
第原创 2024-04-09 22:32:10 · 932 阅读 · 1 评论 -
一文搞定 — — 并查集
一般初始化的时候将每一个值属于的集合都赋值为自己(可以设定一个数组来记录每一个值属于哪一个集合),初始化的意义是设定每一个数值属于一个集合,一共有N个集合,其中N表示数值的个数。然后进行常规的合并,最后进行查找,可以利用一个哈希表进行记录每一个集合的标识,如果第一次找到该集合,那么就进行记录一次,否则就跳过,这样可以将查询的时间复杂度降低到。最后将所有值归位到应属于的集合中,在进行查询的时候直接进行查找值的标志值是否一致,如果一致则说明这两个值是属于一个集合中的。,如此就得到了两种集合,分别是集合。原创 2024-04-07 21:46:44 · 709 阅读 · 0 评论 -
为什么你的二分总是写错?— — 强烈建议学习
r){if(nums[mid] < 5){ // 根据具体情况进行条件按的选择l = mid;return l;// 根据具体情况进行返回。原创 2024-04-06 18:02:33 · 1363 阅读 · 1 评论 -
力扣 — — 98.验证搜索二叉树
节点的右子树只包含天手当前节点的数。),那么就继续向下进行递归,对左子树进行递归的时候需要将参数lower更改为当前节点,因为左子树的值只会比当前节点的值更小。对右子树进行递归的时候需要将参数upper更改为当前节点的值,因为右子树的值只会比当前节点的值更大。在向左子树进行递归的时候,如果当前的节点的左右子树均满足题目要求(节点的左子树只包含小手当前书点的数。在递归的过程中,一共有三个参数,其意义分别是:当前的节点的位置,此时的最大的值,此时的最小的值。原创 2024-04-04 21:31:57 · 261 阅读 · 2 评论 -
蓝桥杯 — — 小蓝的跳跃
借鉴蓝桥云课上别人的思路:对于这个问题,我们只需要求出按照规则进行跳跃的最大值与最小值即可,如果。在求出的最大值与最小值之间,就说明存在一个跳跃的方式能够满足最后的结果为。,利用最简单的动态规划思想进行求解即可。原创 2024-04-04 20:40:01 · 205 阅读 · 1 评论 -
蓝桥杯 — — 混乱的数组
个,x为需要求的逆序对的个数,即题目给出的x),并且使用一个变量用于计数,如果没有填充完毕,就进行严格的单调递增的进行填充,如果填充的长度满足求出的长度就结束填充,最后逆向输出即可。,其实这也是一个组合问题:如3, 2, 1其逆序可以这样思考:从这个序列中任意选择两个数,并且要求不重复,有:32,31,21这三个,可能会有人有这样的疑惑,如果是23,13,12是不是就不满足题目要求了?我们可以利用逆序对来进行求解,如:3, 2, 1其逆序对分别为:2, 1, 0因此数组3, 2, 1的逆序对之和为3。原创 2024-04-04 15:19:37 · 897 阅读 · 1 评论 -
全排列问题
最简单的思路就是使用递归的思想,每次判断完成一个位置之后就进行递归判断下一个位置(需要注意的是,再进行递归之后还需要将位置进行换回来,保证这个位置的数字始终是和原来的数字进行做交换的)解决方案:首先对序列进行排序,然后再每个位置进行判断的时候,都判断该位置之前是否有与之相同的数字进行过了一次交换,如果有:就进行跳过,否则:就进行交换。包含重复数字的序列与不包含重复数字的序列的思想大体相同,只是在原有的基础上多进行判断了一次是否有重复数字。,这个位置不换回来不影响最后的结果,但是在第二个数的时候。原创 2024-04-04 14:22:27 · 390 阅读 · 1 评论 -
快速幂算法
再每一次进行幂乘运算的时候都进行一次取模运算,并且如果指数为偶数,就将底数进行平方,然后将指数取半,如果是奇数,就分离出一个当前的底数,然后将底数进行平方,指数取半,并且如此直到最后,指数一定会变为1。,那么结果将会是非常大的,常规的数据类型无法进行存储。这样就大大优化的算法的时间,将其时间复杂度降为了。如果使用常规算法的思路,我们需要写一个。原创 2024-04-03 20:54:03 · 967 阅读 · 1 评论 -
蓝桥杯 — — 异或和
为哦根节点的子树内的所有点权的异或和,这个我们可以通过一个深度优先搜索实现(广度优先搜索也可以)。在进行搜索的时候可以直接进行异或,即将异或的结果作为一个参数进行传递。个节点的权值,然后输入边,我们可以使用单向边,因为节点值较小的边不可能是节点值较大的点的子节点,因此我们可以使用一个。个操作,对于每一个操作有两种形式,第一种形式是:将点。个节点的树进行求异或和,首先输入。】,第二种形式是:查询以。题目要求需要对一个有。判断进行存放单向边,原创 2024-04-03 13:10:58 · 287 阅读 · 1 评论 -
力扣 — — 42.接雨水
再次审查题目可知,每一个柱子能存放多少雨水与它左边最高的柱子与右边的最高的柱子有关,然后取左右最高柱子的最小值 减去 这个柱子的高度即可得到该柱子能存放的雨水的量(找到每一个柱子的左右最大柱子的高度,我们可以设置两个数组,分别用于记录该柱子的左边的最高柱子,以及右边的最高的柱子。数组,分别记录第i个柱子的左边的高度以及右边的最高的柱子的高度。由于柱子具有最优子结构,即第i个柱子的左边最高柱子与第。记录第i个柱子的左边的最高高度与右边的最高高度的最小值。个柱子的左边的最高高度的柱子的高度。原创 2024-04-03 13:09:22 · 869 阅读 · 1 评论 -
链式前向星
初始化head数组中的所有初值为-1,这样在进行遍历的时候相当于一个终点。链式前向星的基本思路是,使用head记录以i为起点的边的最后一条边,(如:以1为起点,那么。数组中记录的值是以i为起点的最后一次加边的边的位置。数组用于记录该边的终点、权值以及同起点的下一条边的位置。,并且再每一次进行新的记录的时候,会将之前的值记录到。这样得到的是以i为起点的上一条边(因为再对。循环即可遍历到以i为起点的所有终点的值。即可得到其中的一条边,然后令。进行赋值的时候,首先会进行将。为起点的最后一条边,输出。原创 2024-04-03 13:04:15 · 481 阅读 · 1 评论 -
力扣 581— — 最短无序连续子数组
首先对数组进行从前向后遍历,如果遇到的值大于maxNum就直接将maxNum的值更新为这个更大的值,否则就用end记录这个值**【直观的理解是如果数组一直是有序的,那么就不会更新end的值,所以从头向后进行遍历,最后一次更新的end的值就是无序数组的最后一个位置,如:123 645 789,从头向后进行遍历,123不会更新maxNum的值,然后再遍历645的时候,首先会记录一次值6,然后会更新一次位置5, 再更新一次位置4,接着遇到的值是789都比6大,所以不会再更新end的值了】**原创 2024-03-30 23:15:13 · 228 阅读 · 0 评论 -
蓝桥杯 — — 3.保险箱子
dp[ i ][ 0 ] :表示没有借位也没有进位,因此可以有一个dp[ i - 1 ][ 0 ]加上当前位置差值的绝对值即可,然后dp[ i ][ 1 ] 表示借位了,因此需要再x[ i ]的基础上 - 1,dp[ i ][ 2 ]表示进行进位了,因此需要再x[ i ]的基础上再 - 1即可。为了方便起见,我们可以将数字进行逆序排列,即最小位数的数字在第一个位置,这样就省去了判断最高位进位的情况了(即:从最小位开始向最高位进行遍历,每一个位置的。直接转换两个值之间的差值即可(不用管是+1,还是-1)原创 2024-03-29 20:20:11 · 581 阅读 · 3 评论 -
力扣313 — — 超级丑数
因此我们可以从小到大进行寻找每一个数,因为1没有质因数,因此第一个值为1,然后从小到大进行查找,如第一个例子:n = 1, primes = [2, 7, 13, 19] 我们找到的数从小到大为:1 * 2 = 2, 2 * 2 = 4, 1 * 7 = 7, 2 * 2 * 2 = 8, 1 * 13 = 13, 2 * 7 = 14 …如使用了两次2的时候(2 * 2),第三次就不能使用(2 * 2)了,因此index[ 0 ] = 2,dp[index[ 0 ] ] = dp[ 2 ] = 4;原创 2024-03-28 23:01:57 · 329 阅读 · 0 评论 -
归并排序算法
【代码】归并排序算法。原创 2023-08-20 17:46:05 · 80 阅读 · 1 评论 -
选择排序算法
【代码】选择排序算法。原创 2023-08-20 17:43:38 · 68 阅读 · 2 评论 -
交换排序算法 — — 冒泡排序、优化冒泡排序、双向冒泡排序、快速排序
最简单直接的排序方式,时间复杂度为ON2101。原创 2023-08-20 17:41:27 · 75 阅读 · 1 评论 -
插入排序算法
希尔排序是在直接插入排序的基础上进行的改进,思想等同于插入排序,只是直接插入排序每次移动的步长为1,而希尔排序通过改变步长来进行直接插入排序,相邻步长数相等的数为一组,并且在改组内进行直接插入排序。思想:定义一个i来遍历待排序的数组,定义一个j来遍历已经排序的序列,并且j在有序序列中找到合适的位置来存放i所指向的待排序的数。原创 2023-08-20 16:36:30 · 52 阅读 · 1 评论