题目:
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
解法1:递归(队列)
/**
* 思路:
* 如果当前队列的长度是k,就往结果集中加入
* 遍历所有可能的组合,1所有,2所有。。。
* 把当前的数加入队列
* 删除队列尾部,加入新的可能
*/
public List<List<Integer>> combine(int n, int k) {
ArrayList<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> queue = new LinkedList<>();
bracktrack(result,queue,n,k,1);
return result;
}
private void bracktrack(ArrayList<List<Integer>> result, LinkedList<Integer> queue, int n, int k,int curr) {
if (queue.size()==k) {
result.add(new LinkedList<>(queue));
return;
}
for (int i=curr;i<=n;i++){
queue.offer(i);
bracktrack(result,queue,n,k,i+1);
queue.removeLast();
}
}
时间复杂度:On^2
空间复杂度:On
解法2:递归(ArrayList)
/**
* 思路:
* 从1开始不断的填充格子,递归的往list中放入元素
* 如果格子长度达到了k就返回
* 之后删除当前格子的数
*/
public List<List<Integer>> combine(int n, int k) {
ArrayList<List<Integer>> result = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
recursive(result,list,1,0,n,k);
return result;
}
private void recursive(ArrayList<List<Integer>> result, ArrayList<Integer> list, int curr, int lattice, int n, int k) {
if (lattice==k){
result.add(new ArrayList<>(list));
return;
}
for (int i=curr;i<=n;i++){
list.add(i);
recursive(result,list, i+1, lattice+1,n,k);
list.remove(lattice);
}
}
时间复杂度:On^2
空间复杂度:On