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], ]
枚举出所有的长度为k的子集,一般都用递归+深度搜索
public class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> solution = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<Integer>();
helper(solution,path,1,n,k);
return solution;
}
public void helper(List<List<Integer>> solu,List<Integer> path,int from,int n, int k){
if(path.size() == k){
List<Integer> lst = new ArrayList<Integer>(path);
solu.add(lst);
return;
}else
{
for(int i = from;i <= n;i++){
path.add(i);
helper(solu,path,i+1,n,k);
path.remove(path.size()-1);
}
}
}
}
但是效率有点低的,只打败了15%,能不能进行优化呢?于是我们增加一些条件
public class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> solution = new ArrayList<List<Integer>>(); if(k <= n && k >= 1){ List<Integer> path = new ArrayList<Integer>(); helper(solution,path,1,n,k); } return solution; } public void helper(List<List<Integer>> solu,List<Integer> path,int from,int n, int k){ if(path.size() == k){ List<Integer> lst = new ArrayList<Integer>(path); solu.add(lst); }else { for(int i = from;i <= n;i++){ path.add(i); helper(solu,path,i+1,n,k); path.remove(path.size()-1); } } } }
此时打败了76.46%