题目:
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], ]题意:
给定一个n和k,那么返回所有从1到n的数字组合,比如,如果n=4,k=2,那么所有可能的样例为
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
我们可以发现,其实就是对这个数组进行DFS,深度优先遍历。此题可以从头到尾开始遍历,相当于一层嵌套一层,也就是环环相扣,那么我们直接调用递归遍历,相得益彰。
public List<List<Integer>> combine(int n,int k)
{
List<List<Integer>> list = new ArrayList<List<Integer>>();
int[] nums = new int[n];
ArrayList<Integer> l = new ArrayList<Integer>();
dfs(list,l,1,n,k);
return list;
}
public void dfs(List<List<Integer>> list,ArrayList<Integer> l,int start,int n,int k)
{
if(l.size() == k)
{
list.add(new ArrayList<Integer>(l));
return;
}
for(int i = start; i <= n; i++)
{
l.add(i);
dfs(list,l,i + 1,n,k);
l.remove(l.size() - 1);
}
}
注意,DFS递归函数里的参数,有n和k,并且一开始一定是递归结束的条件,也就是当list中的长度等于k,那么就结束此次递归,return到上一层的递归中,继续执行上一层没有执行完的递归,依次类推。此系列还有CombinationsII题目,可以参照。在滴滴出行2017年校园招聘研发类的笔试题中,也出了一题类似的题,不过那题用DFS来做,会超时。