LeetCode 随机 - 全排列 II

版权声明:本文出自 whdAlive 的博客,转载必须注明出处 https://blog.csdn.net/whdAlive/article/details/89028398

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

示例:

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

代码

class Solution {
    public static List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        Arrays.sort(nums);
        core(nums, new int[nums.length], temp, res);
        return res;
    }

    private static void core(int[] nums, int[] visited, List<Integer> temp, List<List<Integer>> res) {
        if (temp.size() == nums.length) {
            res.add(new ArrayList<>(temp));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (visited[i] == 0) {
                //当且仅当重复数字中前面的已经使用过,后面的才可以使用,避免重复
                if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == 0)
                    continue;
                visited[i] = 1;
                temp.add(nums[i]);
                core(nums, visited, temp, res);
                temp.remove(temp.size() - 1);
                visited[i] = 0;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/whdAlive/article/details/89028398