算法

  1. 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))
  2. 数组中每个数左边比它小的数累加和的和——改归并排序,在分完合的过程中产生和
  3. 稳定排序:冒泡排序、插入排序、归并排序、桶排序(数据放到容器里,然后倒出)
    不稳定排序:选择排序、快速排序
  4. 堆排序:脑海里是完全二叉树,实际上是数组
    对于i位置,其左孩子是2i+1,右孩子是2i+2,父节点是(i-1)/ 2
    堆排序:数组先建堆,从下往上走,然后删除堆,从上往下走
    建堆的时间复杂度是log(N),取出堆的最大元素调整堆的时间复杂度是log(N)
  5. 无序数组在O(n)内求排序后的相邻数的差值的最大值:建立n+1个桶,先遍历数组确定最小值和最大值,然后均分为n+1个桶,所以中间会有一个空桶,收集每个桶内出现的最小值和最大值
  6. 用固定长度数组实现栈
    index指向新加数应该填的位置,返回index-1的数,pop的话index–
  7. 用固定长度数组实现队列
    start指向的是如果一个数要出去,该从哪里拿,end指向的是如果添加一个数,加到哪,end和start如果到头则返回0;size变量是当前队列里的个数,如果size等于数组的长度,则不能加数,如果size等于0,则不能减数
  8. 之字型打印矩阵
    在这里插入图片描述
    (r1,c1)先往右移动,直到到头了再往下移动
    (r2,c2)先往下移动,直到到头了再往右移动
    (r1,c1)和(r2,c2)一直在一条对角线上
  9. 回文
    从头遍历压到栈里,再从头遍历顺便压出栈,压出栈的顺序是逆序遍历
  10. 对于链表要考虑快慢指针
  11. 链表的partition
    将链表的节点放在数组中,对数组进行partition
    空间O(1)的做法:建small、equal、big三个链表,先遍历一遍链表,将第一个小于最后一个数的node挂在small,第一个等于的挂在equal,大于的挂在big,然后再遍历,依次挂上不等于每个链表中头结点的数,最后将三个链表拼起来
  12. 克隆复杂节点
    在这里插入图片描述
  13. 单链表相交的一系列问题
    13.1 两个无环链表:用俩个栈或者将第一个节点加入哈希表或者得到len1,len2,从len1-len2处开始一起走,会同时走到相交节点
    13.2 一个有环一个无环不可能相交
    13.3 俩个有环链表
    在这里插入图片描述
    loop1和loop2分别为入环的点
    如果loop1=loop2,则是第二种情况,以loop1为终止条件,做无环链表
    如果不相等,以loop1开始找,如果回到loop1则为第一种,否则返回loop1或loop2都可以
  14. 布隆过滤器
    黑名单问题,要求空间苛刻,单样本的量不小,有一定错误率,以bite来确定某个位置,k个哈希函数,哈希值%m的位置置1,m为bite的最大数,如果查找的话如果所有的位置都是1说明加入过了
  15. 一致性哈希
    处理加机器或减机器时重新计算哈希的问题
    采用一个环覆盖所有的哈希值,将机器也计算哈希值放在环上,然后将数据装在按顺时针找到最近的机器上。为了负载均衡,采用虚拟节点代替机器来计算哈希值放在环上
  16. 找中位数
    建立一个大根堆,一个小根堆,将前一半小的数放在大根堆,后一半大的数放在小根堆
    每次插入数的时候比大根堆的堆顶小插入大根堆,比大根堆的堆顶大插入小根堆,每次插入 比较俩个堆的元素数量之差,如果差大于1,则将大根堆的堆顶插入小根堆或者小根堆的堆顶插入大根堆
  17. 最大收益,K个项目
    按照花费建立一个小根堆,按照收益建立一个大根堆,比启动资金小的项目从小根堆移动到大根堆
  18. 二叉树的非递归遍历
    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型,先左旋再右旋
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值