题意:
给出一个数组,要求顺序遍历其所有组合情况
分析:这个问题的搜索树很简单:
第一层:遍历整个数组(数组中的每个数)
第二层:遍历整个数组(除了父节点)
第三层:遍历整个数组(除了父节点和祖父结点)
...
第n层:剩下的那个数。
所以回溯递归搜索:每一层都遍历数组(除去已访问的,不用打标记,可以直接查找结果集中有没有):
public class Solution {
List<List<Integer>> list = new ArrayList<>();
List<Integer> l = new ArrayList<>();
int nums[];
public List<List<Integer>> permute(int[] nums) {
this.nums = nums;
helper();
return list;
}
public void helper(){
if(l.size() == nums.length){
list.add(new ArrayList(l));
return;
}
for(int i=0; i<nums.length; i++){
if(!l.contains(nums[i])){ //没访问过
l.add(nums[i]);
helper();
//每退出一层集合都要退出那一层的节点,因为不管是不满足还是满足(已放入最终结果集)都用不到了,需要重新利用,放入新的结点
l.remove(l.size()-1);
}
}
}
}