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. 思路
和前一题思路一样,只不过要判断一下是否重复。
2.1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public class { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if(nums.length == 0){ return result; } Arrays.sort(nums); List<Integer> temp = new ArrayList<Integer>(); dfs(result, temp, nums, new boolean[nums.length]); return result; } public void dfs(List<List<Integer>> result, List<Integer> temp, int[] nums, boolean[] used){ if(temp.size() == nums.length){ result.add(new ArrayList<Integer>(temp)); return; } for(int i=0; i<nums.length; i++){ if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue; used[i] = true; temp.add(nums[i]); dfs(result, temp, nums, used); used[i] = false; temp.remove(temp.size() - 1); } } }
|
2.2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
public class { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if(nums.length == 0){ return result; } dfs(result, nums, 0); return result; } public void dfs(List<List<Integer>> result, int[] nums, int index){ if (index == nums.length-1) { List<Integer> subList = new ArrayList<Integer>(); for (int i = 0; i < nums.length; i++) { subList.add(nums[i]); } result.add(subList); return; } for (int i = index; i < nums.length; i++) { boolean flag=false; for(int j=index;j<i;j++){ if(nums[j]==nums[i]) flag=true; } if(flag) continue; int temp = nums[index]; nums[index] = nums[i]; nums[i] = temp; dfs(result, nums, index+1); nums[i] = nums[index]; nums[index] = temp; }
} }
|
近期评论