随笔分类 -  算法

摘要:平衡二叉树 今天有同学问了我如何构造平衡二叉树,总结如下: 平衡因子 BF(balance factor)为该节点左子树高度 右子树高度,绝对值如果 ≤ 1,则二叉树不需要调整。 平衡二叉树构造过程比较简单,分为四种情况: LL 插入 RR 插入 LR 插入 RL 插入 用实例解释一下四种情况的调整 阅读全文
posted @ 2019-12-04 19:36 学习趁早 阅读(472) 评论(0) 推荐(0)
摘要:问题三 判断一个链表是否为回文结构 给定一个链表的头节点 head,请判断该链表是否为回文结构。 思路 第一次遍历,使用一个栈结构存储节点,第二次遍历,与弹出栈存储的值比较,相同为 true 不同为 false。 可以使用快慢指针得到链表的对称轴的下一个节点,然后将值压栈,然后重头开始遍历,省下一半 阅读全文
posted @ 2019-11-28 13:35 学习趁早 阅读(262) 评论(0) 推荐(0)
摘要:问题二 打印两个有序链表的公共部分 给定两个有序链表的头指针 head1 和 head2,打印两个链表的公共部分。 思路:类似于比较两个有序数组共同具有的有序部分。 阅读全文
posted @ 2019-11-28 13:33 学习趁早 阅读(309) 评论(0) 推荐(0)
摘要:二叉树 二叉树按层遍历打印 宽度优先遍历,通常使用队列结构。常常有 按照层数换行 的问题。 思路: 这时可以使用两个变量记录,一个是用变量 last 记录当前的 last 结点,另一个是用变量 nlast 记录下一层的 last 结点。 pop() 时添加子树,如果 pop 值等于 last 指向的 阅读全文
posted @ 2019-11-27 13:32 学习趁早 阅读(120) 评论(0) 推荐(0)
摘要:链表 问题一:反转单向和双向链表 分别实现反转单向链表和反转双向链表的函数。 要求:如果链表长度为 N,时间复杂度要求为 O(N),额外空间复杂度要求为 O(1)。 反转单向链表 反转双向链表 阅读全文
posted @ 2019-11-27 13:31 学习趁早 阅读(180) 评论(0) 推荐(0)
摘要:矩阵问题 问题一:转圈打印矩阵 给定一个整型矩阵matrix,请按照转圈的方式打印它。 要求:额外空间复杂度为O(1)。 本题可以在 "LeetCode 54 螺旋矩阵" 测试结果。 思路 定义一个方法,以左上角的点和右下角的点开始,从边界开始打印矩形。打印一圈后循环遍历内圈的矩形,直到整个矩形打印 阅读全文
posted @ 2019-11-26 18:06 学习趁早 阅读(393) 评论(0) 推荐(0)
摘要:使用数组模拟栈和队列 使用数组模拟栈,包括栈的 push、pop 和 peek 操作。 使用队列实现栈 使用两个队列,一个是存储队列,一个是 help 队列。 helper() 将 queue 队列的数据转移到 help 队列中,只留下 queue 队列尾部的一个元素作为返回值 swap() 将 q 阅读全文
posted @ 2019-11-23 17:47 学习趁早 阅读(165) 评论(0) 推荐(0)
摘要:非基于比较的排序 非基于比较的排序与样本的数据状况有很大的关系,由于这个限制使其在工程中并不常用。 非基于比较的排序有桶排序,基数排序,计数排序。这三者都能做到排序的稳定性,时间复杂度为 O(n),空间复杂度为 O(n)。 问题一 计数排序和基数排序 假设存在一组数据,里面的数据只有 0 ~ 60 阅读全文
posted @ 2019-11-22 17:32 学习趁早 阅读(431) 评论(0) 推荐(0)
摘要:比较器 当排序不是程序的主要内容时,使用自定义比较器能够较快的实现排序目的。需要实现 Comparator 接口。 在构建 PriorityQueue 、 TreeMap 、 TreeSet 时可以传入一个比较器,这时候加入自定义数据类型就会根据制定的比较器规则进行排序。 举个例子:设计一个比较的类 阅读全文
posted @ 2019-11-20 20:14 学习趁早 阅读(538) 评论(0) 推荐(0)
摘要:排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变。 可以: 冒泡排序遇到相等的数不交换即可做到稳定。 插入排序,遇到相等的数即停止比较,插入数组。 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定。 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打 阅读全文
posted @ 2019-11-20 11:50 学习趁早 阅读(750) 评论(0) 推荐(0)
摘要:堆排序 注意,堆这个结构需要知道什么是满二叉树、完全二叉树。堆就是完全二叉树。 堆 使用数组存储数据,用数组模拟二叉堆结构,此时下标的关系有: 父结点 i 的左子结点为 2i + 1,右子结点为 2i + 2 子结点 i 找父结点公式为:(i 1) / 2 堆分大根堆和小根堆,每一个结点为子树的最大 阅读全文
posted @ 2019-11-19 21:52 学习趁早 阅读(536) 评论(0) 推荐(0)
摘要:经典快排 经典快排的思路是选取数组的最后一个数 x,按照 "问题一" 的思路把整个数组划分成 两个部分,将 x 和 大于 x 部分数组的第一个元素交换位置。此时整个数组划分成 三个部分,也就是这一次排序将 x 值排好位置。 再分别对 和 中的数组递归划分,直到划分成一个数,此时所有元素也完成排序。 阅读全文
posted @ 2019-11-19 12:22 学习趁早 阅读(1155) 评论(0) 推荐(0)
摘要:问题一 给定一个数组 arr,和一个数 num,请把小于等于 num 的数放在数组的左边,大于 num 的数放在数组的右边。 要求额外空间复杂度O(1),时间复杂度O(N)。 思路:遇到 arr[i] 小于等于 number 的数,交换 index + 1 和 arr[i],此时 index + 1 阅读全文
posted @ 2019-11-19 10:04 学习趁早 阅读(410) 评论(1) 推荐(0)
摘要:小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和称为小和问题。 此处使用归并排序,在 merge 时,由于左右两部分都已经有序,可以确定一侧的数都大于正在比较的数,例如: 总结 使用归并排序算法的快速之处在于,归并的两个部分对内都是有序的,如 两个部分 阅读全文
posted @ 2019-11-18 14:47 学习趁早 阅读(881) 评论(0) 推荐(0)
摘要:冒泡排序 冒泡排序比较简单,但是容易出现冗余的循环,即使是一个已经排序的数组传入仍然需要遍历 O(n ^ 2)。 选择排序 选择排序时间复杂度也是 O(n ^ 2)。 插入排序 插入排序,有可能是 O(n) 也有可能是 O(n^2),和数据是否已经有序有关。 希尔排序 归并排序使用了递归的方式,利用 阅读全文
posted @ 2019-11-16 22:14 学习趁早 阅读(209) 评论(0) 推荐(0)