这个是回溯算法的排列问题,都可以用经典的回溯三部曲进行解决
class Solution { //回溯三部曲 //1.递归函数,包括全局变量设置 //一如既往,铁打不动的两个全局变量,用于收集结果和结果的集合。再加一个标记数组,用于标记当前数字是否已经使用过 List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); boolean[] used; //递归函数 private void backtracking(int[] nums, boolean [] used){//这个used数组可不写 //2.终止条件,当所有节点都遍历完厚就结束了 if(path.size() == nums.length){ res.add(new ArrayList<>(path)); return; } //3.单层搜索逻辑,这里需要避开的就是已经使用过的节点不能重复使用 for(int i =0; i < nums.length; i++){ if(used[i] == true){ continue; } used[i] = true; path.add(nums[i]); backtracking(nums, used); path.removeLast(); used[i] = false; } } public List<List<Integer>> permute(int[] nums) { if(nums.length ==0){ return res; } used = new boolean[nums.length]; backtracking(nums, used); return res; } }