
算法
算法
Eva_5433
人生没有白走的路,每一步它都算数——考研政治老师孔昱力
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
主定理计算时间复杂度
主定理递归函数的复杂度可以用主定理来计算T(n)=aT(n/b)+O(nd)T(n) = aT(n/b) + O(n^{d})T(n)=aT(n/b)+O(nd)logab=c<dlog_{a}^b = c<dlogab=c<d T(n)T(n)T(n)的时间复杂度为:O(nd)O(n^{d})O(nd)logab=c>dlog_{a}^b = c>dlogab=c>d T(n)T(n)T(n)的时间复杂度为:O(nc)O(n^{c})O(nc)原创 2020-12-03 23:11:47 · 607 阅读 · 0 评论 -
1,给定一棵树的先根遍历序列和后根遍历序列,能否唯一确定一棵树?若能,请举例说明; 若不能,请给出反例。
答:能确定,树的先根遍历和后根遍历对应二叉树的先序遍历和中序遍历。由二叉树的先序遍历和中序遍历可唯一确定一颗二叉树,二叉树可唯一变换为树原创 2020-08-01 09:43:12 · 8449 阅读 · 8 评论 -
9,设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有结点的左、右子树进 行交换的函数。
9,设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有结点的左、右子树进行交换的函数。LeetCode剑指 Offer 27. 二叉树的镜像思路:递归前序遍历,交换左右指针TreeNode* mirrorTree(TreeNode* root) { if(root!= NULL){ TreeNode * p = root->left; root->left = root->right; .原创 2020-07-29 19:59:10 · 593 阅读 · 0 评论 -
8·假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有 双分支结点个数。
8·假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。思路:任何一种遍历都行,判断左右指针都非空的节点的个数。int n = 0;void f(TreeNode *root){ if(root){ if(root->left && root->right) n++; f(root->left); f(root->right); }}...原创 2020-07-28 22:42:32 · 12650 阅读 · 0 评论 -
7,二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法。
7,二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法。LeetCode 958. 二叉树的完全性检验思路:采用层次遍历。只有一下两种情况出现时,一棵树才不是完全二叉树一个节点的左子树为空,右子树非空 在n层遇到过非空节点,然后在n+1层又遇到了非空节点bool isCompleteTree(TreeNode* root) { if(!root){ return true; } queue<原创 2020-07-28 22:21:58 · 3884 阅读 · 0 评论 -
5·假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。
5·假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。LeetCode104. 二叉树的最大深度思路:层次遍历,看一共有多少层int maxDepth(TreeNode* root) { int d = 0; if(root){ queue<TreeNode *> q; q.push(root); while(!q.empty()){原创 2020-07-28 20:59:51 · 5408 阅读 · 0 评论 -
3·编写后序遍历二叉树的非递归算法。
3·编写后序遍历二叉树的非递归算法。// 非递归后序遍历 void postorderTravel(Tree T){ if(T==NULL){ return; } stack< pair<Node *, bool> > S; S.push(make_pair(T, false)); bool isPassed; while(!S.empty()){ pair<Node *, bool>原创 2020-07-28 20:54:21 · 405 阅读 · 0 评论 -
4, 【2019统考真题】请设计一个队列,要求满足: D初始时队列为空; ②入队时,允许增加 队列占用空间; ③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间 只增不减;④入队操作和出
4, 【2019统考真题】请设计一个队列,要求满足: 初始时队列为空; ②入队时,允许增加队列占用空间; ③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为O(1)。请回答下列问题:1)该队列是应选择链式存储结构,还是应选择顺序存储结构?2)画出队列的初始状态,并给出判断队空和队满的条件。3)画出第一个元素入队后的队列状态。4)给出入队操作和出队操作的基本过程。1)队列应选择链式存储结构。如果用顺序存储,当队列满时,无法做到入队原创 2020-07-08 16:49:01 · 4278 阅读 · 0 评论 -
1,若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0 或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试 编写与此结构相应的入队和出队
1,若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队和出队算法。思路:利用tag来标记队列空或满的条件如下为:tag等于0时,若因删除导致 Q.front=Q.rear ,则为队空; tag等于1时,若因插入导致Q.front==Q.rear,则为队满。 队列结构 #define MaxSize 10;typedef struct Queu.原创 2020-07-04 19:50:28 · 9307 阅读 · 0 评论 -
21, 【2009统考真题】已知一个带有表头结点的单链表,结点结构为 data link 假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的 算法,查找链表中倒数第k个位置
21, 【2009统考真题】已知一个带有表头结点的单链表,结点结构为data link 假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0,要求:1)描述算法的基本设计思想。2)描述算法的详细实现步骤。3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C.C+或Java语言实现),关键之处请给出简要注释。答:1)利用双指针原创 2020-07-02 19:26:41 · 9508 阅读 · 9 评论 -
19,设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链 表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表 头结点。
19,设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。思路:设置双指针,p,q;p用来移动,q用来指向当前节点的前一节点。用pm指针保存最小节点的前一节点,即每次把p更新给pm。外循环结束条件是循环链表空。内循环结束条件是q指向头结点。#include<iostream>#include<algorithm>#include<cstdio>#原创 2020-06-30 22:32:40 · 2720 阅读 · 0 评论 -
18,有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表 h1之后,要求链接后的链表仍保持循环链表形式。
18,有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。思路:两个链表都找到最后一个节点,然后再链接#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector&g原创 2020-06-30 22:14:59 · 1651 阅读 · 0 评论 -
17,设计一个算法用于判断带头结点的循环双链表是否对称。
17,设计一个算法用于判断带头结点的循环双链表是否对称。思路:从两头往中间凑,当左指针与右指针相邻并且值相等说明对称;如果做指针等于右指针,说明对称。往中间凑的过程中,有一个不等的,就说明不对称,即可退出。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#inclu原创 2020-06-29 19:52:56 · 3171 阅读 · 0 评论 -
15,已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交 集,并存放于A链表中。
15,已知两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。思路:采用归并排序思想。在归并思想中,如果A的节点小于B的节点,就把A节点插入到一个地方,指针但是在此处,这个值对我们来说是没有用的,删除即可;如果A的节点等于B的节点,A的指针和B的指针都下移;如果A的节点大于B的节点,此时我们需要对B节点操作,但是,此题中,我们只需要比较值,所以B中无需做什么操作。#include<iostream>#include<algorithm原创 2020-06-29 18:52:43 · 11818 阅读 · 3 评论 -
14,设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的 公共元素产生单链表C,要求不破坏A、B的结点。
14,设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。思路:二重循环,比较节点,如果相等,新建节点插入L#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vecto.原创 2020-06-29 17:56:44 · 8135 阅读 · 1 评论 -
13,假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两 个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结 点存放归并后的单链表。
13,假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。思路:方法一:将一个逆置,另一插入排序插进去 方法二:两个都逆置,然后归并排序此处写的是方法一#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>...原创 2020-06-28 19:56:45 · 4320 阅读 · 0 评论 -
12,在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法 去掉数值相同的元素,使表中不再有重复的元素,例如(7, 10, 10, 21, 30, 42, 42, 42, 51
12,在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如(7, 10, 10, 21, 30, 42, 42, 42, 51,70)将变为(7, 10, 21, 30, 42, 51, 70)思路:当前节点和下一个节点比较,如果值相同,删掉下一个节点,指针不移动;如果不相等,指针向下移动#include<iostream>#include<algorithm>#include<cstdi原创 2020-06-28 18:58:54 · 1712 阅读 · 0 评论 -
11,设C=a, ,a, b2,., an,D为线性表,采用带头结点的hc单链表存放,设计一个就地 算法,将其拆分为两个线性表,使得A={a, a2, an, B={b),., , b
思路:遍历hc, 奇数项节点用尾插法插入A,偶数项节点用尾插法插入B#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<set>#includ...原创 2020-06-28 18:39:01 · 1218 阅读 · 0 评论 -
10,将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表 中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
10,将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。思路:隔一个拆一个,拆下来的用尾插法插进去。注意:因为涉及到p->next->next, 需要判断p->next的空#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#i原创 2020-06-28 18:09:14 · 2378 阅读 · 0 评论 -
9,给定一个带表头结点的单链表,设head为头指针,结点结构为(data, next), data 为整型元素, next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素, 并释放结点所占的
9,给定一个带表头结点的单链表,设head为头指针,结点结构为(data, next), data为整型元素, next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作为辅助空间)。思路:插入法从小到大排序,然后输出排序见“6,有一个带头结点的单链表1,设计一个算法使其元素递增有序。”...原创 2020-06-27 12:25:56 · 6405 阅读 · 0 评论 -
8,给定两个单链表,编写算法找出两个链表的公共结点。
8,给定两个单链表,编写算法找出两个链表的公共结点。思路:双层循环,比较#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<set>using na原创 2020-06-27 12:18:54 · 2301 阅读 · 0 评论 -
7,设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表 中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在)。
7,设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在)。思路:与删除x值类似,只是判断变成了区间,而不是等于了#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#includ原创 2020-06-27 12:01:25 · 1905 阅读 · 0 评论 -
6,有一个带头结点的单链表1,设计一个算法使其元素递增有序。
6,有一个带头结点的单链表1,设计一个算法使其元素递增有序。思路:将头结点和第一个节点拆下来,其余节点利用插入排序插进去#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#inc原创 2020-06-26 19:48:20 · 3711 阅读 · 0 评论 -
5·试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)
5·试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)思路:将头拆下来, 剩下的利用头插法插进去#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#i原创 2020-06-26 19:08:24 · 2240 阅读 · 0 评论 -
4·试编写在带头结点的单链表1中删除一个最小值结点的高效算法(假设最小值结点是唯一的)。
4·试编写在带头结点的单链表1中删除一个最小值结点的高效算法(假设最小值结点是唯一的)。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<set>#inc原创 2020-06-26 18:55:23 · 3836 阅读 · 4 评论 -
3,设工为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。
3,设工为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<set>#include<s原创 2020-06-26 18:37:03 · 2034 阅读 · 0 评论 -
2,在带头结点的单链表工中,删除所有值为x的结点,并释放其空间,假设值为x的结点 不唯一,试编写算法以实现上述操作。
2,在带头结点的单链表工中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include&l.原创 2020-06-26 18:23:54 · 1168 阅读 · 0 评论 -
删除不带头结点的单链表工中所有值为x的结点
1.设计一个递归算法,删除不带头结点的单链表工中所有值为x的结点。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<vector>#include<queue>#include<set>using namespa..原创 2020-06-25 19:36:16 · 1273 阅读 · 0 评论