![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法和数据结构
文章平均质量分 52
用于收纳一些算法和数据结构相关的内容。
风雪心
一被C语言,Python,Matlab等多种编程语言深度迫害的大学生在线分享一点琐碎的知识点。
展开
-
【算法】逃离迷宫(奇偶性剪枝)
我们记每个格子的行数和列数之和为x,如果x为偶数,那么格子就是白色,反之奇数时为黑色。容易发现相邻的两个格子的颜色肯定不一样,也就是说每走一步颜色都会不一样。更普遍的结论是:走奇数步会改变颜色,走偶数步颜色不变。其中字符'S'表示起点,字符'D'表示出口,字符'X'表示墙壁,字符'.'表示平地。那么如果起点和终点的颜色一样,而T是奇数的话,就不可能逃离迷宫。同理,如果起点和终点的颜色不一样,而T是偶数的话,也不能逃离迷宫。现在已知出口的大门会在T时间打开,判断在0时间从起点出发能否逃离迷宫。原创 2024-01-29 14:58:30 · 438 阅读 · 0 评论 -
【算法】线段树
几乎是算法竞赛最常用的数据结构了,它主要用于(要求满足结合律)。与树状数组相比,它可以实现的,还可以同时(加、乘),更具通用性。如题,已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x2.求出某区间每一个数的和第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。原创 2024-04-11 16:28:59 · 1275 阅读 · 1 评论 -
【算法】词链(搜索)
如果单词 X 的末字母与单词 Y 的首字母相同,则 X 与 Y 可以相连成 X.Y。(注意:X、Y 之间是英文的句号 )。例如,单词 dog 与单词 gopher,则 dog 与 gopher 可以相连成 dog.gopher。另外还有一些例子:dog.gophergopher.ratrat.tiger连接成的词可以与其他单词相连,组成更长的词链,例如:aloha.arachnid.dog.gopher.rat.tiger注意到,. 两边的字母一定是相同的。原创 2024-01-13 20:56:07 · 917 阅读 · 1 评论 -
【算法】K个数的和(深度优先搜索)
由于解法二没有规定选取的数之间的排列顺序,因此,最后的结果是包含了选取的数之间所有能够排列的情况,因此,为排列数。解法一的每个方案在默认情况下已经规定了所有被选上的数是根据数组下标从小到大有序排列的,因此不同的排列方式最后会被视为一种方案,最后返回的是组合数。解法二由于并没有规定选取的数的下标的排列情况,每次选取一个数,选取数的先后顺序会构成不同的排列。解法一可以理解为是通过第一个形参强行规定了所有选取的数的下标必须按照从小到大的顺序进行排列,因此,不必考虑选取的数之间的排列情况,ans最后为组合数。原创 2024-01-07 11:32:53 · 458 阅读 · 1 评论 -
【算法】判断分段中能否出现次数最多的元素
如果一个数的出现次数比这个序列中其他任何一个数出现的次数都要多,那么这个数是这个序列中出现次数最多的数。每个测试样例的第一行是两个整数n和k(1≤n≤100,1≤k≤100)——分别为数组的大小和出现次数最多的元素。现在给你一个大小为n的数组a,一个整数k,来决定数组a中是否存在非空的序列,满足数k是出现次数最多的元素。每个测试样例的第二行是n个整数,分别从a1到an(1≤ai≤100),为数组a中的元素。对于每个测试样例,如果存在k出现次数最多的序列,则输出“YES”,否则输出“NO”。原创 2023-10-15 20:31:11 · 74 阅读 · 1 评论 -
【算法】短排序
因每行输入仅由a,b,c三种卡牌组成,且规则仅允许进行一次位置交换操作,所以只有给定字符串中有两个字符错位才可能有解。同时我们知道输入的字符串可以比规定的abc的长度更长,但只需要最后能呈现abc即可。虽然这种算法能在字符串的前3个字符的范围内排序,但是在输入的字符串长度大于3,且前三个字符串错位数为奇数的情况下,则不能得到正确的结果。这是因为在比较函数的范围内,只限定了前3个字符的范围。该表明若前3个字符的错位数为奇数,则即便该字符串后面已经呈现了abc,但依然输出NO。原创 2023-10-08 18:19:29 · 144 阅读 · 1 评论 -
删除顺序表中指定元素的两种方法的比较
假设一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于x的元素,要求算法的时间复杂度为O(n),空间复杂度为O(1)。原创 2023-03-04 17:03:09 · 1171 阅读 · 0 评论 -
选择排序法和冒泡排序法的比较
本篇以对元素从小到大有序排列为例,比较了选择排序法和冒泡排序法的相同点和不同点。同:1.循环结构相同:均采用了与i有关的for循环和与j有关的for循环的双层嵌套模式2.最后结果相同:均实现了对元素从小到大的有序排列异:1.比较方式不同:在每一次与i有关的for循环里,选择法确定了一个受i值影响的元素(锁定元素),再将该元素与其余元素比较大小,并进行相应的数值交换;而冒泡法从数组的某一端出发,总是对相邻的两个元素进行比较和数值交换。(选择一动一静,冒泡两者均动)2.筛选结果不同:在两原创 2022-12-10 21:45:30 · 3140 阅读 · 1 评论 -
【取模的运用】计算日期
由于我们输入了具体的年月日,因此我们实际上也就得知了从公元1年1月1日到规定日期具体间隔了多少天,我们得到的完整的年份有(y-1)年(注:平年的365天和闰年的366天均视为完整的一年)。我们可以用i依次遍历这些年,通过不断取模,将ans的结果限定在[0,6]的范围内,最终得到结果为y年的1月1日星期几。然后我们用同样的方法遍历完整的月份,得到y年的m月1日星期几。最后我们对剩下的天数取模,得到y年m月d日星期几。假设星期为w,年份为y,月份为m,日期为d。然后把计算出来的w加上1就是真正的星期几了。原创 2023-08-18 15:31:57 · 128 阅读 · 1 评论 -
【栈的应用】删除栈中的指定元素
由于栈是一个先进先出的序列,若要将栈中值为x的元素进行清除,则需要将栈中所有的元素出栈再进栈,在这一过程中,对所有值为x的元素均进行筛选。然后通过所有元素在两个栈之间的进出来筛选符合要求的元素(即非x)的元素。若有一个顺序栈,其中含有一些值为x的元素,试采用算法将x从栈中清除。本算法的功能是如果栈中存在元素x,将其从栈中清除。原创 2023-08-10 14:44:14 · 1201 阅读 · 3 评论 -
集合及其运算
该函数首先将s1中的全部元素复制到s3中,然后在遍历s2的过程中,调用if语句判断s2中的元素是否重复出现于s1中,倘若没有重复出现,则将s2中的元素复制到s3中。该运算主要是求既在s1也在s2中的元素,但在实际操作时,只需要遍历s1和s2的其中一个数组即可,然后对其中的每个元素均进行条件判断。该运算主要是求仅在s1中而不在s3中的元素,因此需要将s1中所有的元素均进行遍历,然后逐一进行条件判断。由于初始为一个整数数组,因此可采用遍历的形式,将数组中的所有元素依次复制到线性表中。(4)求两个集合的并集。原创 2023-08-04 20:13:58 · 725 阅读 · 1 评论 -
十进制转换为二进制输出
十进制转换为二进制可以通过除留余数法进行,通过不断对二进制数留余数,利用栈将其存储起来。设计一个算法,将一个正十进制整数转化为二进制数进行输出。首先需要具备整数栈的各项基本运算。然后进行具体的操作。原创 2023-08-06 12:13:48 · 368 阅读 · 1 评论 -
【算法】增长序列
要使bn最小,我们令b0=0,接下来贪心即可:从1开始枚举i,枚举到bi时,使得bi=b(i-1)+1,若此时bi=ai,则让bi再加上一个1.一个循环后得到的bn即为所求。如果另一串序列b1,b2,…,bn满足如下条件,则被称为“好序列”。第一行是测试样例的数量t(1≤t≤100)。每个测试样例的第二行是n个正整数a1,a2,…对于每个测试样例,输出单个整数,即“好序列”b中的最小值bn。每个测试样例的第一行是一个正整数n(1≤n≤100)。,bn中,找到最小值。1)bi是一个正整数(i=1,2,…原创 2023-10-08 15:05:05 · 66 阅读 · 1 评论 -
采用线性表求解笛卡尔积
为了实现两个表h1和h2的简单自然连接,先要输入两个表连接的列序号i和j,然后用p指针遍历单链表h1,对于h1的每个数据节点,都用q指针从头至尾遍历单链表h2的所有数据节点,若自然连接条件成立,即h1的p所指节点和h2的q所指节点满足连接条件p->data[i-1]=q->data[j-1],则建立一个连接节点s并添加到结果单链表h中。另外,每行中元素的个数也是不确定的,但由于需要提供随机查找行中的数据元素,所以每行的数据元素采用顺序存储结构,这里用长度为MaxCol的数组data存储每行的数据。原创 2023-07-27 15:48:18 · 165 阅读 · 1 评论 -
【栈的应用】奇偶分类
2) 先将st1中的所有元素(奇数元素)退栈,放到数组a中,并覆盖原有位置的元素,再将st2的所有元素(偶数元素)退栈,放到数组a中并覆盖原有位置的元素。由于一个数组中既有奇数,又有偶数,因此,首先需要采取的是将数组中的元素进行奇偶分类。可以用两个栈分别存储奇数和偶数。所以本算法的功能是利用两个栈将数组a中的所有奇数元素放到所有偶数前面。1) 扫描数组a,将所有奇数进到s1栈中,将所有偶数进到s2栈中。设计一个算法将所有奇数元素放到偶数元素前面。接下来用两个栈分别存储奇数和偶数。首先有栈的基本算法。原创 2023-08-10 11:31:08 · 237 阅读 · 1 评论