77.组合
难度:中等
标签:回溯算法
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路:
1.动手写一下,是如何组合的,然后可以发现,可以类似一棵树,选择一个数,往下,继续选择下一个数,直到选择了k个数,
2.选择一个数,可以用一个栈来存储,返回时,需要删除这个数,寻找下一个,回溯的思想
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class Solution {
public static void main(String[] args) {
List<List<Integer>> lists=combine(4,3);
}
public static List<List<Integer>> combine(int n, int k){
List<List<Integer>> lists=new ArrayList<>();
Deque<Integer> path = new ArrayDeque<>();
zuHe(1,0,lists,path,n,k);
return lists;
}
public static void zuHe(int pos,int level,List<List<Integer>> lists,Deque<Integer> path,int n,int k)
{
/*
pos是选择哪个的位置
*/
if(level==k){
//如果已经选择了k个数
lists.add(new ArrayList<>(path));
}
else {
for(int i=pos;i<=n;i++)
{
//添加到path中
path.add(i);
//继续往下层添加
zuHe(i+1,level+1,lists,path,n,k);
//返回是删除添加的数,回溯到没添加之前,继续for循环
path.removeLast();
}
}
}
}