LeetCode-47. Permutations II(Medium):
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] ]
我的解法:
这道题和46题差不多,也使用递归,唯一不同是序列中有重复数字,我直接用HashSet做,如果HashSet.add成功说明序列不重复,就加入List中,但这样做完之后运行效率很慢,可以看出使用HashSet需要先哈希然后还要对比,看了网上的做法也很简单,就是把初始序列排个序,然后如果取得下一个数和前一个数相同则直接跳过,代码就不详细展示了,这里贴出我用HashSet的答案。
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
HashSet<List<Integer>> anstmp = new HashSet<>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length == 1) {
tmp.add(nums[0]);
List<Integer> tmp1 = new ArrayList<>();
for(int t:tmp) {
tmp1.add(t);
}
if(anstmp.add(tmp1)) {
ans.add(tmp1);
}
tmp.remove(tmp.size()-1);
return ans;
}
for(int i=0; i<nums.length; i++) {
tmp.add(nums[i]);
int[] nums1 = new int[nums.length-1];
int k=0;
for(int j=0; j<nums.length; j++) {
if(j!=i) {
nums1[k] = nums[j];
k++;
}
}
permuteUnique(nums1);
tmp.remove(tmp.size()-1);
}
return ans;
}
}