47.Permutations II
给定一个数组,数组中的元素有重复项,将其全排列,求出全排列的组合。
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:
和46题很相似,但难度比46题更大,如果不使用 set 去重的话,很难做出来。将46题的方法简单去重,再使用set,即可。
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { set<vector<int>> res; sort(nums.begin(), nums.end()); permuteUniqueDFS(nums, 0, res); return vector<vector<int>>(res.begin(), res.end()); } void permuteUniqueDFS(vector<int>& nums, int start, set<vector<int>>& res) { if (start == (int)nums.size()) { res.insert(nums); return; } for (int i = start; i < (int)nums.size(); i++) { if (i > start && i > 0 && ((nums[i] == nums[i - 1]) || nums[i] == nums[start])) continue; else { swap(nums[i], nums[start]); permuteUniqueDFS(nums, start + 1, res); swap(nums[i], nums[start]); } } } };
Java 版:
class Solution { private Set<List<Integer>> set = new HashSet<>(); // 运用Set来去除重复项 public List<List<Integer>> permuteUnique(int[] nums) { Arrays.sort(nums); this.permuteUniqueDFS(nums, 0); return new ArrayList<List<Integer>>(set); //将Set转化为List返回 } private void permuteUniqueDFS(int[] nums, int idx){ if(idx == nums.length){ List<Integer> tmp = new ArrayList<>(); for(int a : nums) tmp.add(a); set.add(tmp);return; } for(int i = idx; i < nums.length; i++){ if(i > idx && nums[i] == nums[i-1]) continue; //适当的剪枝 int number = nums[idx]; //swap nums[idx] = nums[i]; nums[i] = number; this.permuteUniqueDFS(nums, idx + 1); //深搜 nums[i] = nums[idx]; //swap nums[idx] = number; } } }