穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列
题目:
解析:
代码:
//用于返回最后的结果 private List<List<Integer>> ret; //记录决策树元素的路径 private List<Integer> path; //标记决策树元素,元素没有被使用为默认false private boolean[] check; public List<List<Integer>> permute(int[] nums) { ret = new ArrayList<>(); path = new ArrayList<>(); check = new boolean[nums.length]; dfs(nums); return ret; } private void dfs(int[] nums){ //递归出口 if(path.size() == nums.length) { ret.add(new ArrayList<>(path)); return; } for(int i = 0; i < nums.length; i++){ //决策树的元素没有被选,就加入path if(check[i] == false){ path.add(nums[i]);//记录路径 check[i] = true;//被使用过就设置为false dfs(nums); //回溯:把path最后一个元素删除 path.remove(path.size()-1); //剪枝:把元素标志位还原 check[i] = false; } } }