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], ]题目感觉和combinations sum系列差不多,所以,一次就AC。。生搬硬套get- -
因为按照题意,每个数字是只能用一次的,所以也用了visited数组来标记是否被用过
代码如下:
public class Solution {
public List<List<Integer>> combine(int n, int k) {
int[] nums = new int[n];
int j=0;
for(int i=1;i<=n;i++){
nums[j++]=i;
}
Arrays.sort(nums);
ArrayList<List<Integer>> finans = new ArrayList<List<Integer>>();
ArrayList<Integer> curans=new ArrayList<Integer>();
boolean[] visited=new boolean[n];
buildAns(nums,k,0,curans,finans,visited);
return finans;
}
private static void buildAns(int[] nums, int k,int start, ArrayList<Integer> curans,ArrayList<List<Integer>> finans,boolean[] visited){
if(curans.size()==k){
finans.add(new ArrayList<Integer> (curans));
return;
}
for(int i=start;i<nums.length;i++){
if(i>0 && nums[i]==nums[i-1] && visited[i-1]==false) continue;
if(!visited[i]){
curans.add(nums[i]);
visited[i]=true;
buildAns(nums,k,i+1,curans,finans,visited);
visited[i]=false;
curans.remove(curans.size()-1);
}
}
}
}