回溯算法
组合问题
未剪枝优化
import java.util.ArrayList; import java.util.List; class Solution { List<List<Integer>> result = new ArrayList<>(); List<Integer> list = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { int i = 0; backtracking(n,k,i); return result; } public void backtracking(int n, int k, int i){ if (list.size() == k){ result.add(new ArrayList<>(list)); return; } for (int j = i + 1; j <= n; j++){ list.add(j); backtracking(n,k,j); list.remove(list.size()-1); } } }
剪枝优化
来举一个例子,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。
如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。
import java.util.ArrayList; import java.util.List; class Solution { List<List<Integer>> result = new ArrayList<>(); List<Integer> list = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { int i = 0; backtracking(n,k,i); return result; } public void backtracking(int n, int k, int i){ if (list.size() == k){ result.add(new ArrayList<>(list)); return; } for (int j = i + 1; j <= n-(k-list.size()) + 1; j++){ // 剪枝优化 list.add(j); backtracking(n,k,j); list.remove(list.size()-1); } } }
标签:int,list,ArrayList,List,算法,result,回溯,new From: https://www.cnblogs.com/gjwqz/p/18552896