数据结构与算法API
一维数组
- 排序
- 哈希表
- 二分查找
- 动态规划,相邻的关系
- 转换成0-1背包问题:容量,价值,装与不装
- 转换成完全背包问题:物品数量不限
- 滑动窗口
- 双指针
栈的应用
- 括号匹配
- 单调栈
动态规划
- 相邻的关系 => 一层循环
- 遍历扫描 => 两层循环
二叉树
- 递归遍历写法
- 非递归遍历写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52// 前序遍历
public void preorderTraversal(TreeNode root){
TreeNode cur = root;
Deque<TreeNode> stack = new ArrayDeque<>();
while(cur != null || !stack.isEmpty()){
while(cur != null){
// do something here
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
}
// 中序遍历
public void inorderTraversal(TreeNode root){
TreeNode cur = root;
Deque<TreeNode> stack = new ArrayDeque<>();
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
// do something here
cur = cur.right;
}
}
// 后序遍历
public void postorderTraversal(TreeNode root){
TreeNode cur = root;
TreeNode pre = null;
Deque<TreeNode> stack = new ArrayDeque<>();
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();
if(cur.right != null && cur.right != pre){
cur = cur.right;
}
else{
stack.pop();
// do something here
pre = cur;
cur = null;
}
}
}
排序
1 | // 快排 |
字符串处理
- 动态规划:子问题,状态,选择,初始条件,状态转移方程,边界条件细节
字符串搜索
区间问题
单源最短路径
- 迪杰斯特拉算法:贪心更新当前最短距离
- 最小堆更新边 O($mlogm$)
- 遍历点 O($n^2+m$)