- T(n)=aT(n/b)+O(n^d)
以b为底的log a>d,O(N^(以b为底的log a))
以b为底的log a=d,O(N^(d*logN))
以b为底的log a<d,O(N^(d)) - 数组中每个数左边比它小的数累加和的和——改归并排序,在分完合的过程中产生和
- 稳定排序:冒泡排序、插入排序、归并排序、桶排序(数据放到容器里,然后倒出)
不稳定排序:选择排序、快速排序 - 堆排序:脑海里是完全二叉树,实际上是数组
对于i位置,其左孩子是2i+1,右孩子是2i+2,父节点是(i-1)/ 2
堆排序:数组先建堆,从下往上走,然后删除堆,从上往下走
建堆的时间复杂度是log(N),取出堆的最大元素调整堆的时间复杂度是log(N) - 无序数组在O(n)内求排序后的相邻数的差值的最大值:建立n+1个桶,先遍历数组确定最小值和最大值,然后均分为n+1个桶,所以中间会有一个空桶,收集每个桶内出现的最小值和最大值
- 用固定长度数组实现栈
index指向新加数应该填的位置,返回index-1的数,pop的话index– - 用固定长度数组实现队列
start指向的是如果一个数要出去,该从哪里拿,end指向的是如果添加一个数,加到哪,end和start如果到头则返回0;size变量是当前队列里的个数,如果size等于数组的长度,则不能加数,如果size等于0,则不能减数 - 之字型打印矩阵
(r1,c1)先往右移动,直到到头了再往下移动
(r2,c2)先往下移动,直到到头了再往右移动
(r1,c1)和(r2,c2)一直在一条对角线上 - 回文
从头遍历压到栈里,再从头遍历顺便压出栈,压出栈的顺序是逆序遍历 - 对于链表要考虑快慢指针
- 链表的partition
将链表的节点放在数组中,对数组进行partition
空间O(1)的做法:建small、equal、big三个链表,先遍历一遍链表,将第一个小于最后一个数的node挂在small,第一个等于的挂在equal,大于的挂在big,然后再遍历,依次挂上不等于每个链表中头结点的数,最后将三个链表拼起来 - 克隆复杂节点
- 单链表相交的一系列问题
13.1 两个无环链表:用俩个栈或者将第一个节点加入哈希表或者得到len1,len2,从len1-len2处开始一起走,会同时走到相交节点
13.2 一个有环一个无环不可能相交
13.3 俩个有环链表
loop1和loop2分别为入环的点
如果loop1=loop2,则是第二种情况,以loop1为终止条件,做无环链表
如果不相等,以loop1开始找,如果回到loop1则为第一种,否则返回loop1或loop2都可以 - 布隆过滤器
黑名单问题,要求空间苛刻,单样本的量不小,有一定错误率,以bite来确定某个位置,k个哈希函数,哈希值%m的位置置1,m为bite的最大数,如果查找的话如果所有的位置都是1说明加入过了 - 一致性哈希
处理加机器或减机器时重新计算哈希的问题
采用一个环覆盖所有的哈希值,将机器也计算哈希值放在环上,然后将数据装在按顺时针找到最近的机器上。为了负载均衡,采用虚拟节点代替机器来计算哈希值放在环上 - 找中位数
建立一个大根堆,一个小根堆,将前一半小的数放在大根堆,后一半大的数放在小根堆
每次插入数的时候比大根堆的堆顶小插入大根堆,比大根堆的堆顶大插入小根堆,每次插入 比较俩个堆的元素数量之差,如果差大于1,则将大根堆的堆顶插入小根堆或者小根堆的堆顶插入大根堆 - 最大收益,K个项目
按照花费建立一个小根堆,按照收益建立一个大根堆,比启动资金小的项目从小根堆移动到大根堆 - 二叉树的非递归遍历
18.1 前序遍历
18.2 中序遍历
18.3 后序遍历
19. 局部最小:可以用二分
20. 并查集
查俩个元素是否是一个集合
合并俩个元素所在的集合
将边界加到集合里,判断A和C是否在一个集合,如果在的话则不操作,如果不在的话则加到一个集合里,总数量减1
21. 前缀树(字典树)
边是字母
节点有个字段表示有多少个字符串以该字符结尾
节点还有个字段表示该字符划过了几次
22. 图
22.1 邻接表法
前面是节点,后面是该节点的相邻节点
22.2 邻接矩阵
23. 判断一个树是不是另一颗树的子树,将两棵树遍历成字符串,判断字符串是不是子串,注意每个值后面要加个符号表示结束,加个特殊符号表示null
24.
25. 窗口
一个双端队列里保证数是从大到小,队列的头就是窗口内最大的数
26. 单调栈
一个数组中,知道一个数左边离它最近的比它大的和右边离它最近的比它大的数,O(n),做一个栈从栈底到栈顶是从大到小的。当一个数需要从栈弹出时,这个让它弹出的数就是右边离它最近比它大的数,弹出后栈顶就是左边离它最近的比它大的数。当数组遍历完之后,继续处理栈。如果有相同的数,则下标压在一起
27.
28. 环形山峰可以看见的对数,相邻可见,不相邻的中间比俩个山峰最小的还小可见,一个的时候0对,2个的时候1对,i个的时候(2*i-3)对
29. Morris遍历
如果一个节点有左子树,则可以来到该节点2次,且第二次遍历时已经遍历完了该节点所有左子树;如果没有左子树,则只遍历1次该节点
30. 大楼轮廓
31. 连续数组可以考虑必须以某一位置开始或某一位置结束
31. 奇数和偶数个数相等的最长数组,奇数变-1,偶数为1,求累加和为0的最长子数组
32.
33.
34.
35.
36.
37.
38. 贪心求最小次数,可以先以一个变量保存前面的数据最大值,然后一直走到当前最大值不能走再变当前最大值,如最小跳跃次数和加油次数
39. 一个数字除以进制(位运算右移 ),表示去掉最低位的数,112/10
40. 图的宽度优先遍历可以算最短路径
41. 最小步数可以用BFS
42.
43.
44. 右旋(顺时针旋转,原头节点变成新的头节点的右孩子):
45. 左旋(逆时针旋转,原头节点变成新的头节点的左孩子):
46. LR型,先左旋再右旋