LeetCode No47. 全排列 II

题目

给定一个可包含重复数字的序列 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

思路

在回溯的基础上加上去重判断,先排序,然后如果相同的数字已经选了,就不往下走,也就是如下代码。

if( vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {
    continue;
}

AC代码

点击查看代码
class Solution {

    List<List<Integer>> ans;
    int[] nums;
    boolean[] vis;
    int len;

    private void DFS(int cur, List<Integer> list) {
        if( cur == len) {
            ans.add(new ArrayList<>(list));
            return ;
        }
        for(int i=0; i<len; i++) {
            if( vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {
                continue;
            }
            vis[i] = true;
            list.add(nums[i]);
            DFS(cur+1, list);
            vis[i] = false;
            list.remove(list.size()-1);
        }
    }

    public List<List<Integer>> permuteUnique(int[] nums) {
        this.nums = nums;
        Arrays.sort(this.nums);
        ans = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        len = nums.length;
        vis = new boolean[len];
        DFS(0, list);
        return ans;
    }
}
posted @ 2022-05-20 22:06  Asimple  阅读(25)  评论(0编辑  收藏  举报