此题可用回溯法求解,对每次移动时,都有当前路径和选择列表,在走到决策树底层时,返回上层并撤销上层做出的选择。
class Solution {
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> prenum(int[] nums) {
if(nums.length==0){
return res;
}
LinkedList<Integer> track = new LinkedList<>();
permute(nums,track);
return res;
}
private void permute(int[] nums, LinkedList<Integer> track){
if(nums.length==track.size()){//在进入下层时,先判断此时是否为叶子节点。是则返回上层分支继续判断。
res.add(new LinkedList(track));
return;
}
for(int i=0;i<nums.length;i++){//遍历决策树此时可能做出的所有选择
if(track.contains(nums[i])){//排除出现的重复路径
continue;
}
track.add((nums[i]));//添加路径
permute(nums,track);//回溯进入下层结构
track.removeLast();//撤销选择
}
}
}