zoukankan      html  css  js  c++  java
  • Leecode no.47 全排列 II

    package leecode;

    import java.util.*;

    /**
    * 47. 全排列 II
    *
    * 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
    *
    * @author Tang
    * @date 2021/12/23
    */
    public class PermuteUnique {

    int nums[];

    List<List<Integer>> resultList;

    /**
    * 回溯
    * 循环n次,表示n个位置
    * 对每个位置循环判断每个元素,要么选择要么不选择 (避免一下重复元素)
    *
    * @param nums
    * @return
    */
    public List<List<Integer>> permuteUnique(int[] nums) {
    this.nums = nums;
    resultList = new ArrayList<>();

    track( new ArrayList<>(), new int[nums.length]);
    return resultList;
    }

    /**
    * 对当前n位置,选择一个合适的元素
    *
    */
    private void track(List<Integer> permuteList, int[] hasChoose) {
    if(permuteList.size() == nums.length) {
    ArrayList<Integer> list = new ArrayList<>();
    for (Integer i : permuteList) {
    list.add(i);
    }
    resultList.add(list);
    return;
    }

    //repeat防止同一位置上选择了重复元素
    Set repeat = new HashSet();

    for(int i = 0; i < nums.length; i++) {
    //递归前做出选择
    if(hasChoose[i] == 1 || repeat.contains(nums[i])) {
    continue;
    }
    permuteList.add(nums[i]);
    repeat.add(nums[i]);
    hasChoose[i] = 1;

    //执行递归
    if(permuteList.size() == 4) {
    System.out.println();
    }
    track(permuteList, hasChoose);

    //递归后撤销选择
    permuteList.remove(permuteList.size() - 1);
    hasChoose[i] = 0;
    }

    }


    public static void main(String[] args) {

    new PermuteUnique().permuteUnique(new int[]{3,3,0,3});

    }




    }
  • 相关阅读:
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    计算机组成与设计 复习
    概率论与数理统计 期末复习
    SPM(Software Project Management)课程感想
    Software Project Management_JUnit && Maven
  • 原文地址:https://www.cnblogs.com/ttaall/p/15724021.html
Copyright © 2011-2022 走看看