题意:
给两个数n和k。k代表每个组合中的的元素的个数。返回1-n中的k个数字的所有组合。
分析:
画一下搜索树,就发现我们可以采用递归深搜的方式。只要设置好条件即可。(已经加过的不加入)
所以大小数组都设置出现过的不加入。但是写完之后运行发现还有一个没有避免,就是[1,4] 和 [4, 1 ]也不能同时加入。
所以多设置一个参数,每次遍历的时候都从本身的下一个开始,就可以避免重复。
public class Solution {
List<Integer> l;
List<List<Integer>> list;
public List<List<Integer>> combine(int n, int k) {
l = new ArrayList<>();
list = new ArrayList<>();
helper(1, n, k);
return list;
}
private void helper(int s, int n, int k){
if(k==0){
if(!list.contains(l)){
list.add(new ArrayList(l));
}
return;
}
for(int i=s; i<=n; i++){
if(!l.contains(i)){ //设置了i=s之后,这个判断就不必要了
l.add(i);
helper(i+1, n, k-1);
l.remove(l.size()-1);
}
}
}
}