Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
典型的递归回溯法,多做形成这个递归回溯头脑,就好办了。1 递归一次,填入一个数字
2 填入的数字,不能是小于当前数字的值,防止重复
3 回溯:记得pop_back()最后加上的一个数字,回溯到上一层。
4 结束条件:填写够了k个数字的时候,当前填写完毕,回溯
k层树+深度遍历
public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(k > n || k <= 0 || n <= 0){ return res; } boolean[] visited = new boolean[n]; dfs(1,n,new ArrayList<Integer>(),k,res,visited); return res; } public void dfs(int start ,int n,List<Integer> tem,int k,List<List<Integer>> res,boolean[] visited){ if(k == 0){ res.add(new ArrayList<Integer>(tem)); return ; } for(int i = start;i <= n;i++){ tem.add(i); visited[i-1] = true; dfs(i+1,n,tem,k-1,res,visited); tem.remove(tem.size()-1); } }