本人电子系,只为一学生。心喜计算机,小编以怡情。
组合
组给出两个整数n和k,返回从1……n中选出的k个数的组合。
样例
例如 n = 4 且 k = 2
返回的解为:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]
关键词:回溯法,非递归算法代码如下
static public List<ArrayList<Integer>> combine(int n, int k) {
// write your code here
List<ArrayList<Integer>> ret=new ArrayList<>();//定义一个最终返回
int i=0;
int a[]=new int [k];//这里用数组方便些
a[i]=1;//将第一个赋值为1
while(true)
{
if(a[i]<=n-k+1+i)//对每一位进行限制
//例如155,第二个位置不满足这个条件,回溯
{
if(i==k-1)//如果恰好满足在最后位置
{
ret.add(toarraylist(a));//用了自己写的小转换函数
a[i]++;
}
else//否则,说明不在最后一个位置
//例如255,此刻i=0
{
i++;//将i移到下一个位置
a[i]=a[i-1]+1;//变成235,在一轮过后变成234
}
}
else//回溯
{
if(i==0) break;//退出条件
i--;//回溯到前一个位置
a[i]++;//将前一个位置自增1
}
}
return ret;
}
//将数组转换成ArrayList的小函数。可以上网找封装好的函数
static ArrayList<Integer> toarraylist(int a[])
{
ArrayList<Integer> linshi =new ArrayList<>();
for(int i:a)
linshi.add(i);
return linshi;
}