46.
题目描述查看:https://leetcode-cn.com/problems/permutations/
题目的意思是,给定一个无重复数组,求这些数组元素的全排列。
-
思路
典型的回溯问题,找到退出条件,已选结果,候选结果即可。
定义回溯方法,choose表示已选结果,candidate表示候选结果。
private void permuteHelper(List<Integer> choose,List<Integer> candidate)
退出条件是candidate中没有元素。
if(candidate.isEmpty()) { List<Integer> save = new ArrayList<>(choose); reuslt.add(save); return; }
-
代码
1 public class Main { 2 private List<List<Integer>> reuslt = new ArrayList<>(); 3 4 public List<List<Integer>> permute(int[] nums) { 5 List<Integer> choose = new ArrayList<>(); 6 List<Integer> candidate = Arrays.stream(nums).boxed().collect(Collectors.toList()); 7 permuteHelper(choose,candidate); 8 return reuslt; 9 } 10 11 private void permuteHelper(List<Integer> choose,List<Integer> candidate){ 12 if(candidate.isEmpty()) { 13 List<Integer> save = new ArrayList<>(choose); 14 reuslt.add(save); 15 return; 16 } 17 18 for (int i = 0; i < candidate.size(); i++) { 19 choose.add(candidate.get(i)); 20 List<Integer> tmp = new ArrayList<>(candidate); 21 tmp.remove(i); 22 permuteHelper(choose,tmp); 23 choose.remove(choose.size()-1); 24 } 25 }
47.
题目描述查看:https://leetcode-cn.com/problems/permutations-ii/
与46题不同的是,这次数组元素可重复,求全排列。
-
思路
与46题思路一致,回溯法求解,不同之处在于需要对结果进行剪枝。
对数组元素进行排序,这样所有一样的元素都挨在一起。
当候选集中相邻的两个数据一样的时候,重复的选择一样的数据做头一个其实结果都一样。
比如:1,1`,2,你选1做第一个,和选1`做第一个,产生的结果都是重复的。
if(i>0 && candidate.get(i) == candidate.get(i-1))continue;
-
代码
1 public class Main { 2 private List<List<Integer>> reuslt = new ArrayList<>(); 3 4 public List<List<Integer>> permute(int[] nums) { 5 List<Integer> choose = new ArrayList<>(); 6 Arrays.sort(nums); 7 List<Integer> candidate = Arrays.stream(nums).boxed().collect(Collectors.toList()); 8 permuteHelper(choose,candidate); 9 return reuslt; 10 } 11 12 private void permuteHelper(List<Integer> choose,List<Integer> candidate){ 13 if(candidate.isEmpty()) { 14 List<Integer> save = new ArrayList<>(choose); 15 reuslt.add(save); 16 return; 17 } 18 19 for (int i = 0; i < candidate.size(); i++) { 20 if(i>0 && candidate.get(i) == candidate.get(i-1))continue; 21 choose.add(candidate.get(i)); 22 List<Integer> tmp = new ArrayList<>(candidate); 23 tmp.remove(i); 24 permuteHelper(choose,tmp); 25 choose.remove(choose.size()-1); 26 } 27 }