
左程云算法课学习笔记
文章平均质量分 68
学习左程云算法课的学习笔记。包括对知识的理解、思考、扩展、总结和C++代码实现。
星星典典
认真学习,脚踏实地写博文
展开
-
完全二叉树、搜索二叉树、平衡二叉树和满二叉树(C++)
完全二叉树是这样定义的:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)上面的定义看起来比较复杂。所有节点只存在3种情况:1、有左右2个孩子;2、只有左孩子;3、没有孩子(叶节点),即不存在只有右孩子的情况;我们采用层序遍历的方式遍历节点,当遍历到某一个节点,它只有左孩子,或者没有孩子,则后序所有节点一定都是叶节点。如下所示是完全二叉树节点的左子树只包含小于当前节点的数。原创 2024-05-21 16:59:32 · 8601 阅读 · 0 评论 -
二叉树的宽度(广度)优先遍历C++
二叉树的宽度优先遍历,又叫广度优先遍历、层序优先遍历。二叉树的宽度优先遍历可以使用队列完成。原创 2022-07-26 22:50:47 · 1832 阅读 · 0 评论 -
二叉树的先序、中序、后序遍历C++
先遍历根(父)节点、再遍历左节点、最后遍历右节点。注意这里说的遍历并不是行走。毕竟我们能够先取到的指针只有根节点指针,而如果想找一个节点,则一定要先找到它的根节点。这里的遍历指的是“介绍”这棵树的方式。通常来讲,我们是使用的打印的方式“介绍”一棵树的。所以,先序遍历展开来讲是如果一棵树上有根节点,则先输出根节点,再输出左孩子节点、最后输出右孩子节点。例如,上述图1中的二叉树,先序遍历输出是先遍历输出左孩子节点,再遍历输出根节点,最后遍历输出右孩子节点。例如,上述图1中的二叉树,中序遍历输出是。...原创 2022-07-24 21:52:18 · 30946 阅读 · 0 评论 -
单链表相交问题C++
给定两个可能有环也可能无环的单链表,头节点head1和和head2。请实现一个函数,如果两个链表相交,请返回相交的第一个节点。如果不想交,返回null基于这两个链表分别可能有环和无环,基于单链表只能存在一个next指针的特性,我们分成3中情况讨论:则两个链表想要相交,则一定是如下这种形态即两个链表从某个节点开始,存在公共部分,公共部分的第一个节点则为相交节点。由于单链表只能有一个next节点,有环链表的环一定在尾部,而结尾不同的两个链表是无法相交的。所以可以得出结论,不存在这样情况下的相交链表。则两个链表想原创 2022-07-12 21:38:08 · 521 阅读 · 0 评论 -
【题目】复制含有随机指针节点的链表C++
一种特殊的单链表,节点结构如下所示除了next指针外还具有一个随机指向的rand指针,rand指针可能指向链表中的任一节点,也可能为null。给定一个由Node组成的无环单链表的头节点head,请实现一个函数完成对该链表的复制。要求:时间复杂度O(N),额外空间复杂度O(1)如果不要求额外空间复杂度,我们可以开辟一个map来保存新旧节点的对应关系,然后连接新链表。代码如下【测试用例参考】但是题目中要求空间复杂度为O(1),此算法的额外空间复杂度为O(N),不满足要求。为什么要设置此对照组?原创 2022-07-09 21:43:59 · 392 阅读 · 0 评论 -
链表-快慢指针(C++)
链表是由一组在内存中不必相连(不必相连:可以连续也可以不连续)的内存结构Node,按特定的顺序链接在一起的抽象数据类型。我们常见的链表结构有单链表和双向链表。单链表,保存了下一个结点的指针,可以根据下一结点指针向下遍历双向链表,保存了向上一个结点和向下一个结点的指针,所以可以向上下两个方向遍历。单链表结构一般如下:双向链表的结构一般如下:在算法中,我们遇到的链表题目一般可以使用一些经典的思路求解。本篇博客主要讨论这些经典的链表解题思路之一,快慢指针。快慢指针也称龟兔赛跑算法,又叫判圈算法。具体方原创 2022-06-26 18:39:51 · 1841 阅读 · 0 评论 -
【题目】将数组和链表按某值划分成左边小,中间相等,右边大的形式(C++)
数组利用分治算法求解链表利用链表特性求解原创 2022-06-26 15:14:44 · 309 阅读 · 0 评论 -
基数排序的词频表方法
基数排序是非比较排序方法中比较重要的排序。一般情况下,我们都是基于FIFO桶对其实现。基于桶的方法见下面文章:(2条消息) C++实现排序算法_星星典典的博客-优快云博客https://blog.youkuaiyun.com/ymhdt/article/details/123293536本文采用另外一种方式,基于词频表的实现。这里说的词频表可以理解为在数组中某一类数字出现的次数。在基数排序中,我们定义一张表,使用count数组作为容器,用于记录数组 “某位置...原创 2022-04-17 15:01:12 · 195 阅读 · 0 评论 -
递归行为时间复杂度的估算-master公式
一、递归行为递归行为可以简单概括为一个函数调用其自身的行为。一个递归函数中,一定要定义一个有效的退出条件,否则会陷入死循环。本篇文章介绍递归行为时间复杂度快速估算的方法。二、master公式1、使用master公式的条件如果整个递归行为可以等量地分解为a个子问题,即每个子问题的规模等量。就可以使用master公式快速求得时间复杂度。2、master公式公式:T(N) = a * T(N/b)+ O(N^d)复杂度判定:1)log(b,a) > d 则复杂度为原创 2022-04-03 14:08:29 · 860 阅读 · 0 评论 -
二分法的应用-C++
二分法是典型的分治算法。我们使用二分法通常的目的是为了减小遍历规模。假如求解一个问题,本来需要遍历整个数组,得到结果。但是由于数组的特殊性或问题的特殊性,我们能够排除一半的错误结果不需要遍历,这就是二分法的使用逻辑。一般,二分法会把一个时间复杂度为O(n) 的算法缩减为复杂度O(log n)下面使用二分法求解几个问题:1、问题:在一个有序数组中,找某个指定数值是否存在。解:要求解特定值,假设特定值为A。由于数组有序,我们可以先求数组的中间位置的值B,如果A>B,则说明A在B的右原创 2022-03-28 16:53:02 · 1611 阅读 · 0 评论 -
位运算-异或运算的应用(C++)
一、异或运算的表述1)两个数进行位运算,相同的位数异或结果为0;不同的位数,异或结果为1即0^1=1 0^0=0 1^1=0 1^0=12)异或运算还可以理解为 无进位相加二、异或运算的性质1)0^A=A 0异或任何数A都等于A本身2)A^A=0 任何数A异或其本身都等于03)异或运算满足交换律, 即A^B=B^A4)异或运算满足结合律,即(A^B)^C=A^(B^C)三、一些异或运算的应用1、交换操作使a和b的值交换可以写作:【注】a和b必须拥有不相原创 2022-03-20 14:33:46 · 5906 阅读 · 0 评论 -
小和问题及扩展
一、写作本篇文章的目的本篇主要讲述如何用递归法求解小和问题,以及小和问题类似的一类问题。二、小和问题【题目】求一个数组的小和。什么是小和?在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。【算法分析】比如想要求解数组[1,3,4,2,5]的小和:1、根据定义设计的算法直接根据定义,从左往右遍历,每个数值都求出它的小和,并累加求解:1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1,32左边比2小的数:15左边比5小的数:1,3,4,原创 2022-04-05 15:28:04 · 1748 阅读 · 1 评论 -
对数器 - 一种测试算法是否正确的方式
一、背景平时我们在进行算法学习或者开发的时候,可能会烦恼无法验证自己写地算法的正确性。因为不可能找到所有题目可以使用的一套用例。对数器就是一种解决这个问题的方法。二、对数器的基本思想以排序算法为例,假如我们自己写的算法为 funA(int arr[]);1、我们可以使用随机数生成器生成一个大小足够,元素随机的...原创 2022-03-28 22:36:03 · 786 阅读 · 0 评论 -
如何选择排序算法
一、背景原创 2022-04-20 22:35:03 · 877 阅读 · 0 评论