0077.组合
描述
给定两个整数 n 和 k,返回 1 … *n *中所有可能的 k 个数的组合。
实例
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
题解
- 广度遍历
nowIndex
记录当前已经确定的数量nowNum
记录已经确定的最大数字k-nowIndex-1 > n-nowNum
用于判断当前数字是否过大
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new LinkedList<>();
int[] nowList = new int[k];
allCombine(n,k,-1,0,nowList,result);
return result;
}
public void allCombine(int n,int k,int nowIndex,int nowNum,int[] nowList,List<List<Integer>> result){
if (nowIndex == k-1){
//添加结果
List<Integer> list = new ArrayList<>();
for (int i:nowList)
list.add(i);
result.add(list);
return;
}
if (k-nowIndex-1 > n-nowNum){
return;
}
// if (nowNum == n){
// return;
// }
for (int i = nowNum+1; i <= n; i++) {
int[] thisList = nowList.clone();
thisList[nowIndex+1] = i;
allCombine(n,k,nowIndex+1,i,thisList,result);
}
}