递归+回溯
完成!
public List<List<Integer>> combine(int n, int k) { if(k>n){ return new ArrayList<>(); } List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); if(k==n){ for(int i = 1;i<=n;i++){ list.add(i); } res.add(list); return res; } //接下来是k<n的情况 //当数组元素个数==k的时候,将其添加进res //需要一个递归函数 //得有一个标记是否被访问过的参数 boolean[] selected = new boolean[n+1]; backtrack(n,k,res,list,selected); return res; } private void backtrack(int n, int k, List<List<Integer>> res, List<Integer> list,boolean[] selected) { if(list.size() == k){ res.add(new ArrayList<>(list)); return; } for(int i = 1;i<=n;i++){ if(!selected[i] && (list.isEmpty() || i>list.get(list.size()-1))){ list.add(i); selected[i] = true; backtrack(n, k, res, list, selected); selected[i] = false; list.remove(list.size() - 1); } } }
优化之后:
public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); backtrack(n,k,1,0,res,list); return res; } private void backtrack(int n, int k,int start,int cur, List<List<Integer>> res, List<Integer> list) { if(cur == k){ res.add(new ArrayList<>(list)); return; } for(int i = start;i<=n;i++){ list.add(i); backtrack(n, k, i+1,cur+1,res, list); list.remove(list.size() - 1); } }
——2020.8.2