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

    示例 1:

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

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

    提示:

    1 <= nums.length <= 8
    -10 <= nums[i] <= 10


    1. class Solution {
    2. boolean[] used; //判重
    3. public List<List<Integer>> permuteUnique(int[] nums) {
    4. Arrays.sort(nums);
    5. used = new boolean[nums.length];
    6. List<List<Integer>> res = new ArrayList<>();
    7. dfs(nums, new ArrayList<Integer>(), res);
    8. return res;
    9. }
    10. private void dfs(int[] nums, List<Integer> path, List<List<Integer>> res) {
    11. if (path.size() == nums.length) {
    12. res.add(new ArrayList<Integer>(path));
    13. return;
    14. }
    15. for (int i = 0; i < nums.length; ++i) {
    16. //[1,1,2]判重,同一层的不能选一样的
    17. if (i > 0 && nums[i] == nums[i-1] && !used[i-1]) continue;
    18. if (!used[i]) {
    19. used[i] = true;
    20. path.add(nums[i]);
    21. dfs(nums, path, res);
    22. path.remove(path.size() - 1);
    23. used[i] = false;
    24. }
    25. }
    26. }
    27. }