题目
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
代码
public class Solution {
List<List<Integer>> list=new ArrayList<List<Integer>>();
boolean[] visited;//分割每层,之前没有是因为之前处理的字符串,通过substring起到了同样的效果
public List<List<Integer>> combine(int n, int k) {
if(n==0||n<k)
return list;
visited=new boolean[n];
help(n,k,new ArrayList<Integer>(),0);
return list;
}
public void help(int n, int k,ArrayList<Integer> array,int index)//str是对于每次的处理元数据(子问题),array是一种结果
{
if(index==k)//结束条件,index表示层数
{
list.add(new ArrayList<>(array));//注意不同
return ;
}
int left;
if(array.isEmpty())
{
left=0;
}else left=array.get(array.size()-1);
for(int i=left;i<n;i++)//每一层可供选择的种类,
{
if(visited[i])
continue;
visited[i]=true;//处理过
array.add(i+1);//加入
help(n,k,array,index+1);//递归
array.remove(array.size()-1);//除去
visited[i]=false;//消去处理
}
return ;
}
}
反思
通过限制深度向下遍历的顺序(大小)去除重复元素,即对每层的可供选择项