$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Self-defined math definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Math symbol commands \newcommand{\intd}{\,{\rm d}} % Symbol 'd' used in integration, such as 'dx' \newcommand{\diff}{{\rm d}} % Symbol 'd' used in differentiation ... $$

46.47.全排列

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     }

 

posted @ 2020-04-04 17:16  V丶vvv  阅读(231)  评论(0编辑  收藏  举报