LeetCode-100题(Hot) 47. 全排列 II [Java实现] [极速]

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]


本质思路还是去除排列中的重复元素,那么由两种方式:

  1. 去除重复结果
  2. 去除重复过程

对于第一种,在java下可以直接用HashSet储存最终列表,虽然有点不讲武德但不妨是一种方式。

对于第二种,我们可以在46题的基础上增加重复项筛选,筛选条件为 当前项已被使用 当前项与上一项重复且上一项未被使用。即每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」。同级的 !used[i-1] 确保了只有依次排列时重复项才可被填入(i = 0),当当前项为非首重复项且前一项未被调用时,跳过此次枚举。以下以输入 [1, 1, 3] 为例;

  1. 当 index = 0 时,存有 [1, 1, 3] [1, 3, 1] 
  2. 当 index = 1 时,有 [1, 1, 3] [1, 3, 1] 此时符合判断条件执行跳过
  3. 当 index = 2 时,存有 [3, 1, 1]
    private int[] nums;
    private final List> result = new LinkedList<>();

    public 

你可能感兴趣的:(LeetCode,leetcode,java,算法)