Skip to content

Commit dc25bba

Browse files
committed
week03 second commit
1 parent 32d44ac commit dc25bba

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

Week03/NOTE.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@
3333
}
3434
#####递归思维要点
3535
1.不要进行人肉递归(最大误区)
36-
2.找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
36+
2.找到最近最简方法,将其拆解成可重复解决的问题
37+
(重复子问题)
3738
3.数学归纳法的思维
38-
#####分治回溯就是一种特殊的递归或者是较为复杂的递归
39+
#####分治回溯就是一种特殊的递归或者是较为复杂的递归
40+
按照DFS算法的策略,从跟结点出发搜索解空间树。首先根
41+
结点成为活结点(指自身已生成但其孩子结点没有全部生
42+
成的结点),同时也成为当前的扩展结点(指正在产生孩
43+
子结点的结点)
44+
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
45+
这个新结点就成为新的活结点,并成为当前扩展结点。
46+
如果在当前的扩展结点处不能再向纵深方向移动,则当
47+
前扩展结点就成了死结点(指其所有子结点均已产生的结
48+
点)。此时应往回移动(回溯)至最近的一个活结点处,
49+
并使这个活结点成为当前的扩展结点。回溯法以这种方式
50+
递归地在解空间中搜索,直到找到所要求的解或解空间中
51+
已无活结点为止。

Week03/com/myhomework/Combine.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.myhomework;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Stack;
6+
7+
public class Combine {
8+
private List<List<Integer>> res = new ArrayList<>();
9+
10+
private void findCombinations(int n, int k, int begin, Stack<Integer> pre) {
11+
if (pre.size() == k) {
12+
// 够数了,就添加到结果集中
13+
res.add(new ArrayList<>(pre));
14+
return;
15+
}
16+
// 关键在于分析出 i 的上界
17+
for (int i = begin; i <= n; i++) {
18+
pre.add(i);
19+
findCombinations(n, k, i + 1, pre);
20+
pre.pop();
21+
}
22+
}
23+
24+
public List<List<Integer>> combine(int n, int k) {
25+
// 特判
26+
if (n <= 0 || k <= 0 || n < k) {
27+
return res;
28+
}
29+
// 从 1 开始是题目的设定
30+
findCombinations(n, k, 1, new Stack<>());
31+
return res;
32+
}
33+
34+
}

0 commit comments

Comments
 (0)