leetcoe--47. Permutations II

1、问题描述

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]
]

2、边界条件:重复数字,去重方法是重要考察点,采用事前去重是有效率的。

3、思路:排列问题,递归的方法实现,先取一个数放在位置1,然后剩下N-1个位置,再依次放入;循环,取第二个数放在位置1。

4、代码实现

方法一

class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> results = new ArrayList<>();
        Arrays.sort(nums);
        List<Integer> numList = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            numList.add(nums[i]);
        }
        permuteUnique(results, new ArrayList<Integer>(), numList);
        return results;
    }

    public void permuteUnique(List<List<Integer>> results, List<Integer> cur,
                              List<Integer> numList) {
        if (0 == numList.size()) {
            List<Integer> result = new ArrayList<>(cur);
            results.add(result);
            return;
        }
        for (int i = 0; i < numList.size(); i++) {
            if (i != 0 && numList.get(i) == numList.get(i - 1)) { //事前去重
                continue;
            }
            cur.add(numList.get(i));
            numList.remove(i);
            permuteUnique(results, cur, numList);
            numList.add(i, cur.get(cur.size() - 1));
            cur.remove(cur.size() - 1);
        }
    }
}

方法二

优化一下数据结构

原文地址:https://www.cnblogs.com/shihuvini/p/7450407.html