https://leetcode.com/problems/permutations-ii/
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]
, and [2,1,1]
.
所以首先对num数组排序,然后进行permutation,注意这里避免重复的方法是,每层递归是决定当前位置的数,如果要permutation之间不重复,则当前位置不能有重复数字,所以递归中for循环最后有跳过重复数字,但是当前位置和下一个位置是可以重复的,所以进入递归之前不需要跳过重复数字。
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> rst = new LinkedList<List<Integer>>();
if(num==null || num.length==0) return rst;
Arrays.sort(num);
List<Integer> pmt = new LinkedList<Integer>();
HashSet<Integer> index = new HashSet<Integer>();
helper(num, rst, pmt, index);
return rst;
}
public void helper(int[] num, List<List<Integer>> rst, List<Integer> pmt, HashSet<Integer> index){
if(pmt.size()==num.length){
rst.add(new LinkedList<Integer>(pmt));
return;
}
if(pmt.size() > num.length) return;
for(int i=0; i<num.length; i++){
if(index.contains(i)) continue;
pmt.add(num[i]);
index.add(i);
helper(num, rst, pmt, index);
index.remove(i);
pmt.remove(pmt.size()-1);
while((i+1)<num.length && num[i+1]==num[i]) i++;
}
}
}
一共有n层递归,所以空间复杂度O(n),时间复杂度O(n!),因为第i层要进入(n-i)个递归,一共有n层。