leetcode47. Permutations II

来源:互联网 发布:解密码软件 编辑:程序博客网 时间:2024/06/05 17:51

47. Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,[1,1,2] have the following unique permutations:[  [1,1,2],  [1,2,1],  [2,1,1]]

解法

回溯法。使用used数据标记每个元素是否被访问过。
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1]) continue;用于去除重复的情况,比如[1, 1, 2], [1, 1, 2]

public class Solution {    public List<List<Integer>> permuteUnique(int[] nums) {        List<List<Integer>> permutes = new ArrayList<List<Integer>>();        if (nums == null || nums.length == 0) {            return permutes;        }        List<Integer> permute = new ArrayList<Integer>();        boolean[] used = new boolean[nums.length];        Arrays.sort(nums);        helper(permutes, permute, nums, used);        return permutes;    }    private static void helper(List<List<Integer>> permutes, List<Integer> permute, int[] nums, boolean[] used) {        // 出口        if (permute.size() == nums.length) {            permutes.add(new ArrayList<Integer>(permute));            return;        }        // 过程        for (int i = 0; i < nums.length; i++) {            if (used[i]) continue;            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1]) continue;            used[i] = true;            permute.add(nums[i]);            helper(permutes, permute, nums, used);            used[i] = false;            permute.remove(permute.size() - 1);        }    }}
原创粉丝点击