题目
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],
]
分析
求组合结果
回溯法
并设置一个数组,已经用过的元素设为0
在判断为0时跳过
class Solution {
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new LinkedList<>() ;
List<Integer> list =new LinkedList<>();
int[] array = new int[n];
for (int i = 0;i<array.length;i++) {
array[i] = i+1;
}
resurce(result,list,array,k);
return result;
}
public static void resurce(List<List<Integer>> ret, List<Integer> list, int[] array, int n) {
if (n == 0) {
ret.add(list);
return;
}
int start;
if (list.size()>0) {
start= list.get(list.size()-1);
} else {
start = 0;
}
for (int i = start; i<array.length; i++) {
if (array[i] ==0) {
continue;
}
List<Integer> newList = new ArrayList<>(list);
int tmp = array[i];
newList.add(array[i]);
array[i] = 0;
resurce(ret, newList, array, n-1);
array[i] = tmp;
}
}
}