zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    DirectX9:基础篇 第五章 绘制流水线
    他山之石:可以攻玉
    C89:论内存分配问题
    C89:关键字
    MFC:开头篇 介绍
    DirectX9:先导篇 数学基础
    模仿轮播图效果
    text选中后displa出label内容
    ASP.NET页面之间传递值的几种方式
    jquery-delay(),queue()
  • 原文地址:https://www.cnblogs.com/vshen999/p/12632691.html
Copyright © 2011-2022 走看看