学习笔记
private void recur(level, params) {
// 1. terminator
if (level > MAX_LEVEL) {
process_result();
return;
}
// 2. prepare data
prepare_data(parmas);
// 3. drill down
recur(level+1, newParams);
// 4. restore current status
restore(params);
}
private void divide_conquer(problem, params) {
// 1. terminator
if (problem == NULL) {
process_last_result();
return;
}
// 2. prepare data
data = prepare_data(problem)
subProblems = split_problem(problem, data);
// 3. drill down
// 3.1 (conquer subproblems)
subresult0 = divide_conquer(subProblems[0]);
subresult1 = divide_conquer(subProblems[1]);
...
// 3.2 process and generate the final result for current level.(merge subresults)
result = process_result(res0, res1);
// 4. restore current level status
restore(params);
}
backtrace:对于构建时决策树,涉及三个概念:
- 路径 (已经做出的选择)
- 选择列表 (当前可做出的选择)
- 结束条件
result = []
def backtrack(path,选择列表):
if 满足结束条件:
res.add(path)
return
for 选择 in 选择列表:
# 做选择
将该选择从选择列表移除
path.add(选择)
backtrack(路径, 选择列表)
# 撤销选择
path.remove(选择)
将该选择重新加入选择列表
网上针对有重复元素(通过排序,与不通过排序)与无重复元素的方案,以及针对结果集是否按做任意顺序返回,个人还得继续从中选出适合自己理解与有共性的方法
- 不要人肉递归
- 找最近重复子问题
- 数学归纳法
找状态定义与状态转移方程
- 验证BST的时候,数值边界处理,以及比较的时候=处理
- 二叉树的最小深度:递归条件写错(当左或右子树存在的时候,返回大值;当左右子树都存在的时候,返回小值)
-[x] 二叉树的最近公共祖先(Facebook 在半年内面试常考) -[ ] 从前序与中序遍历序列构造二叉树(字节跳动、亚马逊、微软在半年内面试中考过) -[x] 组合(微软、亚马逊、谷歌在半年内面试中考过) -[x] 全排列(字节跳动在半年内面试常考) -[x] 全排列 II (亚马逊、字节跳动、Facebook 在半年内面试中考过)
-[ ] 多数元素 (亚马逊、字节跳动、Facebook 在半年内面试中考过) -[x] 电话号码的字母组合(亚马逊在半年内面试常考) -[ ] N 皇后(字节跳动、苹果、谷歌在半年内面试中考过) -[x] Pow(x, n) (Facebook 在半年内面试常考) -[ ] 子集(Facebook、字节跳动、亚马逊在半年内面试中考过) -[x] 爬楼梯(阿里巴巴、腾讯、字节跳动在半年内面试常考) -[x] 括号生成 (字节跳动在半年内面试中考过) -[x] 翻转二叉树 (谷歌、字节跳动、Facebook 在半年内面试中考过) -[x] 验证二叉搜索树(亚马逊、微软、Facebook 在半年内面试中考过) -[x] 二叉树的最大深度(亚马逊、微软、字节跳动在半年内面试中考过) -[x] 二叉树的最小深度(Facebook、字节跳动、谷歌在半年内面试中考过) -[x] 二叉树的序列化与反序列化(Facebook、亚马逊在半年内面试常考)