题目
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],
]
题目大意:从1~n个数字找出所有k个数的组合。
思路
受上两个题的影响,发现也可以利用相同的思路,借用一个Map来保存个数为1~n的所有组合,最后再取出为k个所有组合即可。但是这样由于求出了所有的组合,因此,可能效率不会高。
实现代码如下:
代码比较容易理解,如果看不懂可以参考上两篇博文。
public class Solution {
boolean increment(int[] arr){
if(arr==null||arr.length<1){
return false;
}
int len=arr.length;
arr[len-1]++;
for(int i=len-1;i>=0;i--){
if(arr[i]>=2){
if(i==0){
return false;
}
else{
arr[i]-=2;
arr[i-1]++;
}
}
}
return true;
}
public List<List<Integer>> combine(int n, int k) {
if(n<1||k<1){
return null;
}
Map<Integer,List<List<Integer>>> map=new HashMap<Integer,List<List<Integer>>>();
//开辟一个长度为n的标志数组,并初始化为零
int arr[]=new int[n];
for(int i=0;i<n;i++){
arr[i]=0;
}
int arrNum[]=new int[n];
for(int i=0;i<n;i++){
arrNum[i]=i+1;
}
while(increment(arr)){
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<n;i++){
if(arr[i]==1){
list.add(arrNum[i]);
}
}
int size=list.size();
List<List<Integer>> l=map.getOrDefault(size, new ArrayList<List<Integer>> ());
l.add(list);
map.put(size, l);
}
return map.get(k);
}
}
AC结果如下:
从结果可以看出,Runtime 25ms,确实效率很低下。