1、数据结构
应对算法相关,没有思想,最暴力的穷举
1.1 数组
普通数组
顺序数组
数据的稳定性
边界,循环变量
数值变量的范围
优化思路
- 处理特殊情况
- 特殊标记位
相关算法
- 双指针
- 快慢指针[最小公倍数,最公约数]
- 滑动窗口
- 多路合并
- 引入Map结构
- 索引与数据的关系
1.2 链表
穿针引线
虚拟节点
归并排序
链表的双&多指针
1.3 栈&队列
遍历:
- DFS(Deepth First Search 深度优先搜索)
- BFS (Breadth First Search 广度优先搜索)
- FIFO,LIFO
- 逆波兰表达式,中缀——前缀——后缀
1.4 树&堆
树
树相关概念:满二叉树,完全二叉树(树每层都是满的,或者只有最下一层逐步成为满树),平衡二叉树(左右子树高度差值不超过1),斜树,搜索树
树的深度
树的遍历
- 深度优先
- DRL(前序)
- RDL(中序)
- RLD(后序)
- 广度优先
堆
堆一定是完成二叉树,大根堆,小根堆,解决top排序的问题
- 构建堆(堆新增节点)
- 堆节点删除
2、算法
2.1 排序算法
- 冒泡排序 O(N*N) o(1)
- 选择排序 O(N*N) o(1)
- 插入排序 O(N*N) o(1)
- 快速排序 O(NLog(n)) o(1)
- 希尔排序 分段插入排序
- 归并排序 两路归并排序
- 堆排序 构建堆
- 计数排序 O(N) O(M)
- 桶排序
- 基数排序
2.2 查找算法
- 二分查找
- 剪枝算法
2.3 递归
递归:终止条件(函数能够退出),递归条件
二维平面的回溯:floodfill
N皇后的问题
递归优化
- 借助栈,将递归调用修改非递归调用
- 减少递归调用中重复计算(剪枝优化)
- 使用空间来记录重复计算的结果
2.4 动态规划
问题之间存在关联关系,相互影响,通过动态转移方程来求出最优解
背包问题
递归解法——动态规划的相互转换
LIS:动态规划
dijkstra 就是动态规划
动态规划的回溯
优化操作
记忆化搜索,最优子结构+重叠子结构
2.5 贪心算法
局部最优 OR 全局最优
贪心算法:确定是否可以使用贪心算法,每一次都要去最大值或者最小值
贪心选择性:最贪心的结果,不会剩下的结果产生影响
数学归纳法:
反正法:
2.6 字符串
- BF(Brute Force)算法
- BM(Boyer-Moore)算法
H E R E O I S O A O S I M P L E O E X A M P L E | E X A M P L E
1、坏字符,没有出现,直接移动len(demo),出现移动最后一个与坏字符相等的位置len(demo)-lastIndex(demo,demo[len])
2、 好后缀,同样的,好后缀已经好后缀子串在demo从后向前出现的位置
- KMP(Knuth-Morris-Pratt)算法
待了解
2.7 位操作:
与或非 亦或 同或
- 取模
- 奇偶数、除2
- 交换
- n和n-1的关系
2.7 模拟
通过模式事物的操作,来完成问题求解
算法优化
4、验证
对数器
如何验证你算法是正确的