算法与数据结构
文章平均质量分 50
算法与数据结构
紫罗兰盛开
左手编程,右手理财
展开
-
算法进阶之路(七):二叉树面试真题解析及解题技巧总结
一、二叉树的打印解题思路:使用递归思路,从根节点依次打印左孩子和右孩子,直至最后一层即可,关键是设计出树的结构,我们先看打印效果:打印效果相当于一颗平躺的二叉树,顺时针旋转90度,即是一颗我们常见的二叉树,头节点用“H”包裹,左子树用“^”包裹,右子树用“v”包裹。我们固定每个节点的长度len,这里设置的17,然后不足的用空格分别在值的前后均匀补充。代码如下:二、打印二叉树的后继节点解题思路:1.后继节点指的是在二叉树中序遍历中,该节点后面的节点。中序遍历,当前节点是x的最右边节点,则x原创 2022-01-20 15:53:41 · 7852 阅读 · 0 评论 -
算法进阶之路(六):二叉树的结构分析及常见面试题
一、二叉树的遍历二、遍历代码—递归方式先序遍历:中序遍历:后序遍历:总结发现:先序、中序、后序只是递归序加工的结果要想遍历所有的节点,每个节点必须经过三次,每次第一次经过时就打印,便是先序遍历;第二次经过时才打印,便是中序遍历;第三次经过时才打印,便是后序遍历。三、遍历代码—非递归方式上面代码是通过递归的方式实现遍历,任何递归的方式都可以通过非递归的方式实现,通过栈这种数据结构同样可以实现遍历,本遍提供先序的非递归方式实现,感兴趣的小伙伴可以自己实现下中序和后序遍历,无非是压栈和出原创 2022-01-18 14:23:24 · 7958 阅读 · 0 评论 -
算法进阶之路(四):桶排序之计数排序和基数排序以及排序的稳定性
一、桶排序简介 前面我们介绍的所有排序,选择排序、冒泡排序、插入排序、归并排序、快速排序、堆排序等,都是基于比较的排序,而桶排序是基于容器的排序,主要分为:计数排序和基数排序,时间复杂度都是O(N),额外空间复杂度O(M),但是应用范围有限,需要样本的数据状况满足桶的划分。二、计数排序计数排序,不是基于元素比较,而是利用数组下标确定元素的正确位置。1:找出原数组中元素值最大的,记为max。2:创建一个新数组count,其长度是m原创 2021-10-25 13:57:47 · 21295 阅读 · 0 评论 -
算法进阶之路(三):堆的数据结构、排序及应用
一、堆的数据结构 堆就是用数组实现的二叉树,主要分为两种:最大堆和最小堆。两者的差别在于节点的排序方式,在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。 需要注意的是,堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。例如,在一个最大堆中,最大的那一个元素总是位于 in原创 2021-10-21 15:25:19 · 14633 阅读 · 0 评论 -
算法进阶之路(二):递归、归并排序和快速排序
1.递归递归的本质是利用系统栈的数据结构,完成遍历,因此任何递归行为都可以改为非递归。递归的时间复杂度分析:任何递归的时间复杂度最终都可以使用上面的表达式来表示,其时间复杂度按照公式分析即可。真题分析使用递归的方式,判断数组任意范围内的最大值,代码实现如下:...原创 2021-10-15 16:31:06 · 15608 阅读 · 0 评论 -
算法进阶之路(一): 时间复杂度和空间复杂度
一、前言时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小,一般都用大O表示法来表示,记作:T(n)=O(f(n)),都是评估算法的核心指标,评估算法优劣的核心指标除了时间和空间复杂度,还包含常数项时间,其中时间和空间复杂度主要由执行流程决定,常数项时间主要有时间细节决定。下文中我们将一一介绍。二、评估算法优劣的核心指标1.常数时间的操作如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间,称这样的操作常数时间的操作。2.时间复杂度时间复杂度,本质上是原创 2021-10-14 15:15:29 · 20708 阅读 · 0 评论 -
利用数组实现简单的循环队列
原理:在数组不做扩容的前提下,如何让新元素入队并确定新的队尾位置呢? 我们可以利用已出队元素留下的空间,让队尾指针重新指回数组的首 位。这样一来,整个队列的元素就“循环”起来了。在物理存储上,队尾的位 置也可以在队头之前。当再有元素入队时,将其放入数组的首位,队尾 指针继续后移即可。一直到(队尾下标+1)%数组长度 = 队头下标 时,代表此队列真的已 经满了。需要注意的是,队尾指针指向的位置永远空出1位,所以队列最大容量比数组长度小1。这就是所谓的循环队列。public class CirculeQ原创 2021-07-30 15:34:20 · 12556 阅读 · 0 评论 -
单向链表的java实现
定义节点@Datapublic class LinkNode { /** * 节点中的值 */ private int data; /** * 节点中的指针,指向下一个节点 */ private LinkNode next;}链表的常规操作及测试/** * @author ljx * @Description: 链表的常规操作及测试 * @date 2021/7/29 2:35 下午 */public class原创 2021-07-29 15:59:23 · 91 阅读 · 0 评论 -
移动零算法求解
一、题目要求二、解体思路1.双指针法思路:左指针代表0元素的起始位置,右指针代表数组的遍历位置;在没有遇到0之前,左指针和右指针的位置是相同的,此时什么都不需要做;在遇到0之后,左指针和右指针的位置不在相同,此时需要调换位置,即把右指针的值赋值给左指针,右指针改为0,同时左指针左移一位代码如下: public static void moveZeroes(int[] nums) { int left = 0; for (int right = 0;rig原创 2021-07-21 13:42:35 · 133 阅读 · 0 评论