核心思想:
1. 数据结构底层只有两种,数组,链式(指针指向对象)
2. 学会遍历,增删改查操作
动态规划:
穷举+优化
官方定义:basecase-> 状态转移-> 结果
穷举:
a. 递归的目的也是遍历所有可能
# 自顶向下递归的动态规划
def dp(状态1, 状态2, ...):
for 选择 in 所有可能的选择:
# 此时的状态已经因为做了选择而改变
result = 求最值(result, dp(状态1, 状态2, ...))
return result
a.1
树形可能性图也可以用数组递归,如下
leetcode 22
public void generateAll(char[] current, int pos, List<String> result) {
if (pos == current.length) {
if (valid(current)) {
result.add(new String(current));
}
} else {
current[pos] = '(';
generateAll(current, pos + 1, result);
current[pos] = ')';
generateAll(current, pos + 1, result);
}
}
b. for遍历
# 自底向上迭代的动态规划
# 初始化 base case
dp[0][0][...] = base case
# 进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2...)
优化:
备忘录/DP table 避免重复计算
BFS && DFS
以二叉树为例子
1. BFS 优先把每一层深度遍历完
q:= queue
q.add(n)
depth:=0
bfs(q) { // 核心解法:每一层遍历完,把下层找到放到新队列中,下一次接着遍历
if q.isempty(){return}
for q.isempty() {
n = q.poll
if n.val = target {return}
if n.lelf!=nil {temp.add(n.left)}
if n.right!=nil{temp.add(n.right)}
}
bfs(tempq)
depth++
}
2. DFS 同理
dfs(n *node)
if node=target {return}
if (node.left!=nil) dfs(node.left)
if (node.right!=nil) dfs(node.right)