Skip to content

Commit 6574692

Browse files
committed
回溯法 5大题型
1排列 全排列 有重复数字的排列 2组合 重复元素组合 3求和 重复元素求和 4子集 重复元素子集 5扩展题型 如ip划分 回文数划分 数字打出字母等。 重点在于:递归前标记元素,每次完整递归结束需要清除标记元素。 判断递归结束条件。 细节问题如list的添加,contains使用等。
1 parent 343a3b4 commit 6574692

9 files changed

+231
-6
lines changed

src/BackTracking/IP地址划分.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55

66
/**
77
* Created by 周杰伦 on 2018/4/1.
8+
* 1 file committed: 回溯法
9+
* 5大题型
10+
* 1排列 全排列 有重复数字的排列
11+
* 2组合 重复元素组合
12+
* 3求和 重复元素求和
13+
* 4子集 重复元素子集
14+
* 5扩展题型 如ip划分 回文数划分 数字打出字母等。
15+
* 重点在于:递归前标记元素,每次完整递归结束需要清除标记元素。
16+
* 判断递归结束条件。
17+
* 细节问题如list的添加,contains使用等
818
*/
919
//1111
1020
//222 222 222 222

src/BackTracking/N皇后.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package BackTracking;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/2.
5+
*/
6+
public class N皇后 {
7+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package BackTracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collection;
6+
import java.util.List;
7+
8+
/**
9+
* Created by 周杰伦 on 2018/4/2.
10+
*/
11+
public class 和为某数的所有组合 {
12+
public static void main(String[] args) {
13+
int []a = {2,3,6,7};
14+
System.out.println(Arrays.toString((combinationSum(a,7).toArray())));
15+
16+
}
17+
18+
public static List<List<Integer>> combinationSum(int[] candidates, int target) {
19+
List<Integer> arr = new ArrayList<>();
20+
List<List<Integer>> list = new ArrayList<>();
21+
backTracking(arr, 0, 0, candidates, target, list);
22+
return list;
23+
}
24+
25+
public static void backTracking(List<Integer> arr,int cur,int sum,int[]nums, int target, List<List<Integer>> list) {
26+
if (sum == target) {
27+
list.add(new ArrayList(arr));
28+
return;
29+
}
30+
for (int i = cur;i < nums.length;i ++) {
31+
//终止条件很重要,否则会死循环
32+
if (sum + nums[i] <= target) {
33+
arr.add(nums[i]);
34+
sum += nums[i];
35+
backTracking(arr, i, sum, nums, target, list);
36+
sum -= nums[i];
37+
arr.remove(arr.size() - 1);
38+
}
39+
}
40+
return;
41+
42+
}
43+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package BackTracking;
2+
3+
import java.util.*;
4+
5+
/**
6+
* Created by 周杰伦 on 2018/4/2.
7+
*/
8+
public class 和为某数的所有组合2 {
9+
public static void main(String[] args) {
10+
int []a = {10, 1, 2, 7, 6, 1, 5};
11+
System.out.println(Arrays.toString((combinationSum2(a,8).toArray())));
12+
13+
}
14+
15+
public static List<List<Integer>> combinationSum2(int[] candidates, int target) {
16+
List<Integer> arr = new ArrayList<>();
17+
List<List<Integer>> list = new ArrayList<>();
18+
Arrays.sort(candidates);
19+
backTracking(arr, 0, 0, candidates, target, list);
20+
return list;
21+
}
22+
23+
public static void backTracking(List<Integer> arr,int cur,int sum,int[]nums, int target, List<List<Integer>> list) {
24+
if (sum == target) {
25+
if (!list.contains(arr))
26+
list.add(new ArrayList(arr));
27+
return;
28+
}
29+
for (int i = cur;i < nums.length;i ++) {
30+
//终止条件很重要,否则会死循环
31+
if (sum + nums[i] <= target) {
32+
arr.add(nums[i]);
33+
sum += nums[i];
34+
backTracking(arr, i + 1, sum, nums, target, list);
35+
sum -= nums[i];
36+
arr.remove(arr.size() - 1);
37+
}
38+
}
39+
return;
40+
41+
}
42+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package BackTracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
/**
8+
* Created by 周杰伦 on 2018/4/2.
9+
*/
10+
public class 数字的所有不同组合 {
11+
public static void main(String[] args) {
12+
int n = 4,k = 2;
13+
System.out.println(Arrays.toString(combine(n,k).toArray()));
14+
}
15+
public static List<List<Integer>> combine(int n, int k) {
16+
List<Integer> arr = new ArrayList<>();
17+
List<List<Integer>> list = new ArrayList<>();
18+
backTracking(arr,1, n, k, list);
19+
return list;
20+
}
21+
public static void backTracking(List<Integer> arr,int left, int n, int k, List<List<Integer>> list) {
22+
if (arr.size() == k) {
23+
list.add(new ArrayList(arr));
24+
return;
25+
}
26+
for (int i = left;i <= n;i ++) {
27+
arr.add(i);
28+
backTracking(arr, i + 1, n, k, list);
29+
arr.remove(arr.size() - 1);
30+
}
31+
return;
32+
33+
}
34+
}

src/BackTracking/数独.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package BackTracking;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/2.
5+
*/
6+
public class 数独 {
7+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package BackTracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
/**
8+
* Created by 周杰伦 on 2018/4/2.
9+
*/
10+
public class 数组的所有子集 {
11+
public static void main(String[] args) {
12+
int []a = {1,2,3};
13+
System.out.println(Arrays.toString(subsets(a).toArray()));
14+
}
15+
16+
public static List<List<Integer>> subsets(int[] nums) {
17+
int m = nums.length;
18+
Arrays.sort(nums);
19+
List<List<Integer>> list = new ArrayList<>();
20+
ArrayList<Integer> arr = new ArrayList<>();
21+
for (int i = 1 ;i <= nums.length;i ++) {
22+
backTracking(arr, nums,0, i, list);
23+
}
24+
list.add(new ArrayList<>());
25+
return list;
26+
}
27+
public static void backTracking(ArrayList<Integer> arr, int []nums, int left , int len, List<List<Integer>> list) {
28+
if (arr.size() == len) {
29+
list.add(new ArrayList<>(arr));
30+
return;
31+
}
32+
for (int i = left;i < nums.length && i < nums.length;i ++) {
33+
arr.add(nums[i]);
34+
backTracking(arr, nums, i + 1,len,list);
35+
arr.remove(arr.size()-1);
36+
}
37+
38+
return;
39+
}
40+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package BackTracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
/**
8+
* Created by 周杰伦 on 2018/4/2.
9+
*/
10+
public class 数组的所有子集2 {
11+
public static void main(String[] args) {
12+
int []a = {1,2,2};
13+
System.out.println(Arrays.toString(subsetsWithDup(a).toArray()));
14+
}
15+
16+
public static List<List<Integer>> subsetsWithDup(int[] nums) {
17+
int m = nums.length;
18+
Arrays.sort(nums);
19+
List<List<Integer>> list = new ArrayList<>();
20+
ArrayList<Integer> arr = new ArrayList<>();
21+
for (int i = 1 ;i <= nums.length;i ++) {
22+
backTracking(arr, nums,0, i, list);
23+
}
24+
list.add(new ArrayList<>());
25+
return list;
26+
}
27+
public static void backTracking(ArrayList<Integer> arr, int []nums, int left , int len, List<List<Integer>> list) {
28+
if (arr.size() == len) {
29+
if (!list.contains(arr)) {
30+
list.add(new ArrayList<>(arr));
31+
}
32+
return;
33+
}
34+
for (int i = left;i < nums.length && i < nums.length;i ++) {
35+
arr.add(nums[i]);
36+
backTracking(arr, nums, i + 1,len,list);
37+
arr.remove(arr.size()-1);
38+
}
39+
40+
return;
41+
}
42+
}

src/DFS/填充封闭区域.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ private void boundaryDFS(char[][] board, int i, int j) {
6868
// for (int i = 1;i < m - 1;i ++) {
6969
// for (int j = 1;j < n - 1;j ++) {
7070
// if (board[i][j] == 'O' && legal(board, i, j)) {
71-
// dfs(board,visit,i,j);
71+
// backTracking(board,visit,i,j);
7272
// }
7373
// }
7474
// }
7575
// }
76-
// public boolean dfs(char[][] board, int [][]visit, int x, int y) {
76+
// public boolean backTracking(char[][] board, int [][]visit, int x, int y) {
7777
// if (x < 0 || y < 0 || x >= board.length || y >= board[0].length) return false;
7878
// if (!legal(board, x, y)) return false;
7979
// if (board[x][y] == 'X') return true;
@@ -84,13 +84,13 @@ private void boundaryDFS(char[][] board, int i, int j) {
8484
// board[x][y] = 'X';
8585
// return true;
8686
// }
87-
// boolean left = dfs(board,visit,x - 1,y);
87+
// boolean left = backTracking(board,visit,x - 1,y);
8888
// if (!left) return false;
89-
// boolean right = dfs(board,visit,x + 1,y);
89+
// boolean right = backTracking(board,visit,x + 1,y);
9090
// if (!right) return false;
91-
// boolean up = dfs(board,visit,x,y + 1);
91+
// boolean up = backTracking(board,visit,x,y + 1);
9292
// if (!up) return false;
93-
// boolean down = dfs(board,visit,x,y - 1);
93+
// boolean down = backTracking(board,visit,x,y - 1);
9494
// if (!down) return false;
9595
//
9696
// board[x][y] = 'X';

0 commit comments

Comments
 (0)