算法
这是很长很好的一生
计算机专业研究生
展开
-
PAT 1035插入与归并
这道题考察的是插入排序和归并排序的实现,首先要做的就是判断使用的是插入排序还是归并排序,我用的方法是:遍历第二个数组,找到第一个不是增序的元素(也就是小于前一个元素的元素),然后从这个元素开始遍历后边的数组,判断当前元素是否与原数组中相同位置的元素相等,若在遍历结束之前出现了不相等,则就是归并排序,否则是插入排序,因为插入排序每次将一个元素放到该放的位置,所以无序的元素和原数组相同。原创 2023-03-29 16:29:44 · 245 阅读 · 1 评论 -
利用DFS实现无环图拓扑排序
若节点u是v的祖先,则在调用DFS访问u的过程中,必然会递归访问v,并且v的DFS函数结束时间早于u的DFS函数结束时间。若u是v的子孙,则v的结束时间一定大于u的结束时间。若是其他关系则在拓扑排序中的顺序随意。则可以考虑在DFS调用的过程中设定一个时间标记,在DFS调用结束时,对各个节点计时,祖先节点的结束时间必然大于子孙节点的结束时间。从而按照结束时间排序,可以得到一个拓扑排序。对于有向无环图的任意节点u,v,它们之间的关系必然是祖先与子孙节点或者其他关系。...原创 2022-08-15 15:16:28 · 1087 阅读 · 2 评论 -
图的深度优先搜索的非递归算法
使用一个栈来记忆下一步可能访问的节点,同时使用一个访问标记数组visited来记忆第i个顶点是否在栈内或者曾经在栈内,若是则它以后不再进栈,图采用邻接表的形式存储。原创 2022-08-12 16:52:19 · 2761 阅读 · 4 评论 -
完全二叉树插入器
定义完全二叉树数据类型,定义一个二叉树指针类型的数组用来模拟队列,再定义一个top指向队首,在初始化完全二叉树时找到第一个没有左子树或者右子树的节点,用top记录下他的位置,此后每次插入,插入top指向的节点缺少的部分,再判断节点是否完整了,若完整则将top+1,rear指向队列中最后一个节点,每次新插入的节点入队至rear后面的位置。那么,只有倒数第二层(如果存在)最右侧的若干个节点,以及最后一层的全部节点可以再添加子节点,其余的节点都已经拥有两个子节点。这是LeetCode上的一道题目。...原创 2022-07-25 10:51:27 · 213 阅读 · 0 评论 -
非递归算法求二叉树的高度
采用层次遍历的算法,设置变量level记录当前节点所在的层数,设置变量last指向当前层最右边的节点,每次层次遍历出队时与last指针作比较,若两者相等,则层数+1,并让last指向下一层的最右节点,直到遍历完成。level即为二叉树的高度。...原创 2022-07-23 16:13:18 · 2888 阅读 · 2 评论 -
二叉树的后序遍历的非递归实现算法
栈顶D的右孩子为空,出栈并访问,此时栈顶元素为B,有右孩子且未被访问过,将E入栈,E没有右孩子,访问并出栈,此时B的右孩子已经被访问过了,访问B并出栈,此时的栈顶元素A不空且没有被访问过,CF入栈,F的右孩子为空,访问并出栈,C的右孩子不为空,G入栈,G没有右孩子,访问G并出栈,此时C的右孩子已经被访问,访问C并出栈。最后访问A节点,栈为空,结束遍历。2.读取栈顶元素,若其右孩子不为空且从来没有被访问过,将右子树执行步骤1,否则弹出栈顶元素并访问。1.沿着根的左孩子,依次入栈,直到左孩子为空。...原创 2022-07-23 15:51:50 · 795 阅读 · 0 评论 -
字典树学习 根据前缀词根建立字典树
一.字典树概念字典树又被称作Trie树,其效率非常高,所以在字符串查找,前缀匹配中应用非常广泛,其高效率是以空间为代价的。典型应用是用于统计和排序大量的字符串,它的优点是,最大限度地减少无谓的字符串比较,查询效率比哈希表更高。 例题...原创 2022-07-07 21:40:21 · 276 阅读 · 0 评论 -
一次遍历找出单链表中倒数第k个元素
设计一个尽可能高效的算法,通过链表的一次遍历,找到倒数第k个节点的位置原创 2022-07-05 16:19:58 · 527 阅读 · 0 评论 -
寻找两个单链表的公共节点
给定两个单链表,找出两个链表的公共节点。原创 2022-07-04 10:08:36 · 1948 阅读 · 0 评论 -
下一个排列,将给定数字序列重新排列成下一个更大的排列
将给定数字序列重新排列成字典序中下一个更大的排列原创 2022-07-03 16:14:59 · 541 阅读 · 0 评论 -
深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先和广度优先是在图和树的遍历搜索中比较常用的搜索方法深度优先算法简介DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等.原创 2022-04-27 11:51:23 · 32230 阅读 · 5 评论 -
字典序及1-n之间的数按字典序排列
今天在刷LeetCode的时候遇见了一道题,题的要求是“给你一个整数n,按字典序返回范围[1, n]内所有整数。你必须设计一个时间复杂度为O(n)且使用O(1)额外空间的算法。”开始以为是简单的输出,提交后发现与答案相差甚多,看评论后方了解按字典序是什么意目录一、何为字典序二、解题步骤1.1-n整数的字典序2.算法3.代码一、何为字典序字典序,顾名思义就知道是按照字典的顺序来排序,给你abcdefg你知道怎么排序,那12,48,68,122,...原创 2022-04-18 14:22:28 · 7379 阅读 · 0 评论 -
判断链表中是否存在环形链表,找出环形链表的起始位置
环形链表定义给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。判断是否存在环形链表哈希表我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。这个算法的时间复杂度:O(N),其中 N为链表中节点的数目。我们恰好需要访问链表中的每一个节点。空间复杂度:O(N),其中 N为链表中节点的数目。我们需要将链表中的...原创 2022-05-02 15:18:10 · 1139 阅读 · 0 评论 -
将数组整体左移p个位置算法及C语言实现
将数组整体左移p个位置算法及C语言实现原创 2022-06-29 16:11:38 · 563 阅读 · 0 评论 -
删除线性表中所有为e的数据
对于长度为n的线性表,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,算法删除线性表中所有值为e的数据元素。原创 2022-06-28 11:37:35 · 725 阅读 · 0 评论 -
约瑟夫环和问题详解
问题描述约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。约瑟夫环问题是这样的:0, 1, …, n 这 n个数字排成一个圆圈,从数字 0开始,每次从这个圆圈里删除第 m个数字,然后从第m+1个数字开始循环重新求出这个圆圈里剩下的最后一个数字。解题思路当只有一个人时,那么最后剩下的一定是他,我们用f(n,k)表示有n个人每次第k个人出局,最后剩下的人的下标...原创 2022-05-04 18:45:01 · 2064 阅读 · 0 评论 -
寻找两个升序序列的中位数
设一个长度为L的升序序列S,在第L/2个位置的数据称为序列的中位数两个序列的中位数是含有他们所有元素的升序序列的中位数找到该中位数原创 2022-06-30 12:27:02 · 1262 阅读 · 0 评论 -
水塘抽样及LeetCode398题随机数索引
水塘抽样水塘抽样是一系列的随机算法水塘抽样解决的问题对一个数量未知的样本,希望只经过一次遍历就完成随机抽样,即时间复杂度O(n)。因为样本数量未知,因此就不能通过random函数直接随机抽样。这个问题的难点在于,随机选择是「动态」的,比如说你现在你有 5 个元素,你已经随机选取了其中的某个元素a作为结果,但是现在再给你一个新元素b,你应该留着a还是将b作为结果呢,以什么逻辑选择a和b呢,怎么证明你的选择方法在概率上是公平的呢?水塘抽样的逻辑...原创 2022-04-25 12:27:21 · 702 阅读 · 0 评论 -
关于凸包算法和叉积的应用
凸包算法及向量的叉积,附实例及解法原创 2022-04-23 12:16:31 · 708 阅读 · 0 评论 -
找到数组中出现次数最多的数据
找到数组中出现次数最多的数据原创 2022-06-30 20:43:19 · 3245 阅读 · 0 评论 -
将单链表按升序排序
有一个带头结点的单链表L,设计一个算法使其元素递增有序原创 2022-07-02 14:47:25 · 2805 阅读 · 0 评论