随笔分类 - 算法笔记
摘要:14.6:排序总结 1、不基于比较的排序,对样本数据有严格的要求,不易改写。 2、基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用。 3、基于比较的排序,时间复杂度的极限是O(N * logN)。 4、时间复杂度O(N * logN)、额外空间复杂度低于O(N)、且稳定的基于比较的排序是不
阅读全文
摘要:14.5:真正意义上的快排:随机快排 [ ....?... X] 随机从数组中选一个数和最右侧的数进行交换, [ ....X... ?] 拿这个?数作为目标数 将数组划分成: [ <? ==? >? ?] 只需要将最后?和>?区域的第一数交换,?就来到了==?区域 [ <? ==? ? >? ] 此
阅读全文
摘要:14.4:快排2.0 [ ..... X] 利用数组的最后一个数X作为目标数 将数组划分成: [ <X ==X >X X] 只需要将最后X和>X区域的第一数交换,X就来到了==X区域 [ <X ==X X >X ] 此时==X的位置固定下来,不用变了。 通过递归: 处理[ <x ]区域 处理[ >x
阅读全文
摘要:14.3:快排1.0 [ ..... X] 利用数组的最后一个数X作为目标数 将数组划分成: [ <=X >X X] 只需要将最后X和>X区域的第一数交换,X就来到了==X区域 [ <=X X >X ] 此时X的位置固定下来。 通过递归: 处理[ <=x ]区域 处理[ >x ]区域
阅读全文
摘要:14.2:荷兰国旗问题:分3区域 分3区域、<X 放左边,X放中间, >X放右边 例子: <)[ 3, 4, 6, 0, 7, 4, 5, 1, 3 ](> 目标数:4 1、当前数 < 目标数,当前数和小于区的下一个数交换,小于区右括,当前数跳下一个。 2、当前数 == 目标数,当前数直接跳下一个。
阅读全文
摘要:14.1:荷兰国旗问题:分2区域 有数组arr[ L ...R ],给你一个数X, 拿X去划分数组 1:分2区域、<=X 放左边, >X放右边 2:分3区域、<X 放左边,X放中间, >X放右边 再划分后的区域内,不要求一定有序。 要求不用辅助数组,时间复杂度O(N) 1、当前数<=目标,当前数和(
阅读全文
摘要:14:快排 前置知识:荷兰国旗问题 比较: 快排1.0 快排2.0 和随机快排
阅读全文
摘要:https://leetcode-cn.com/problems/count-of-range-sum/ 套例子: 0 1 2 3 arr[ 1, -1, -2, 3] 范围[ -1, 1 ] 暴力解法: 0-0 [ 1 ] 累加和1 符合范围 √ 0-1[1,-1] 累加和0 符合范围 √ 0-2
阅读全文
摘要:前置知识:前缀累加和 arr[ i ....j ] 求sum[ i, j ]的和 等价于 sum[ i, j ] = preSum[ 0, j ] - preSum[ 0, i-1 ] 前缀和的生成: index 0 1 2 3 4 5 6 arr [-3, 1, 2, 4, 0, -1, 5] 遍
阅读全文
摘要:13.6 : 加强堆,通过改写经典堆的底层代码
阅读全文
摘要:13.5: 最大线段重合问题(堆实现),敏感度 给定很多线段,每个线段都有左右两个位置 [ start, end ],表示线段开始位置和结束位置,左右都是闭区间, 规定: 1、线段的开始和结束位置一定都是整数值; 2、线段重合区域的长度必须 >= 1,一个点不算重合区域; 线段 a [1, 3] b
阅读全文
摘要:13.4:建堆两种方式以及时间复杂度讨论 这也是堆这一章节最重要的两方法,涉及到后面的加强堆的实现。 1、如果是一个数一个数的给,自然可以通过heapInsert()来建堆,这是自下而上的方式, 时间复杂度O(N * logN); 2、给一个数组建堆也可以通过heapify()的方式,这是自上而下的
阅读全文
摘要:13.3:堆排序说明 基于比较的排序时间复杂度O(N * logN)是最好的了 1、先让整个数组都变成大根堆,建立堆的过程 1.1、从上到下的方法,时间复杂度O(N * logN) 1.2、从下到上的方法,时间复杂度O(N) 2、把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调整堆,一直周
阅读全文
摘要:13.2:堆排序 基于比较的排序时间复杂度O(N * logN)是最好的了 理解了堆以及堆里面的heapInsert() 和heapify(),堆排序就简单了。 1、把数组中的所有数都调成大根堆。heapSize = N。 2、0位置的数和N-1位置的数进行交换。heapSize = N - 1。
阅读全文
摘要:13.1:堆的heapify下沉过程 现在的要求是: 此时在大根堆上,将最大的数max返回,剩下的数自动按照大根堆的要求重新建成新的大根堆? 操作思路: [ 8 7 0 1 6 ] 下标: 0 1 2 3 4 我们知道大根堆上最大值一定在index = 0位置上,所以给用户直接返回max = 8没问
阅读全文
摘要:13:堆结构heap (priority queue)重要结构 之 上移过程heapInsert() 1、堆结构就是用数组实现的完全二叉树结构; 2、完全二叉树中如果每棵树(包括子数) 的最大值都在顶部 是 大根堆; 3、完全二叉树中如果每棵树(包括子数) 的最小值都在顶部 是 小根堆; 4、堆结构
阅读全文
摘要:12:比较器 1、比较器的实质是重载比较运算符; 2、比较器可以很好的应用在特殊标准的排序上; 3、比较器可以很好的应用在根据特殊标准的结构上; 4、写代码异常容易,还用于泛型编程; 1 public static class Student { 2 public String name; 3 pu
阅读全文
摘要:11.3:逆序对问题 [3 1 0 4 3 1] 在这个数组里有多少个逆序对? 从某个数开始往后看 1、3 1;3 0;3 1; 2、1 0; 3、4 3; 4 1; 4、3 1; 现在是不是在说每个数的右边有多少个数比它小? 经典方法从右往左merge,规则 1、当两个数相等的时候,先拷贝右组数。
阅读全文
摘要:11.4:大于2倍问题 [ 6 7 1 3 2] 每个数num,问num右边 有多少个数满足 :num > 右*2 6; 1 和 2; 6 > 右侧有2个数 [ 1 2 ] 乘以2 7; 1、3和2; 7 > 右侧有3个数 [1 2 3 ] 乘以2 1; 1 > 右侧有0个数 [ ] 乘以2 3;
阅读全文
摘要:11.2:小和问题,暴力求解和归并思想求解 例: [ 6 3 2 1 6 7] 每个数左边,比它小的数累加起来 6; 6的左边有多少个数比6小,0个; 3; 3的左边有多少个数比3小,0个; 2; 2的左边有多少个数比2小,0个; 1; 1的左边有多少个数比1小,0个; 6; 6的左边有多少个数比6
阅读全文