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); } } }
方法二
优化一下数据结构