47-排列II

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


Example:

Input: [1,1,2]
Output:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

问题描述
给定一组数,可能会有重复元素,返回所有可能的排列


问题分析

回溯法
思路,先对数组排序,方便过滤重复排列,使用一个boolean数组标记遍历过的元素,进行回溯


解法

class Solution {
    public List> permuteUnique(int[] nums) {
        List> result = new ArrayList>();
        //标记遍历过的元素
        boolean[] used = new boolean[nums.length];
        //先对数组排序
        Arrays.sort(nums);

        find(result, new ArrayList(), used, nums, 0);

        return result;
    }
    public void find(List> result, List line, boolean[] used, int[] nums, int count){
        if(count == nums.length){
            result.add(new ArrayList(line));
        }else{
            for(int i = 0;i < nums.length;i++){
                    if(used[i]) continue;
                    //重复排列
                    if(i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
                    line.add(nums[i]);
                    used[i] = true;
                    find(result, line, used, nums, count + 1);
                    used[i] = false;
                    line.remove(line.size() - 1);
            }
        }
    }
}

你可能感兴趣的:(算法与数据结构,leetcode全解)