文内代码全部采用JAVA语言。
题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
测试用例
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
个人解法
个人想法是递归,每次从notin里面选出一个数放入list tans中,然后让notin中剩下的数组成新的list newnotin 继续进行排列组合,然后将newnotin的结果List<List>,按顺序全部倒入tans中,有几个内层list就复制几个tans来盛。
从notin里面选出的数用set集合去重,以免产生重复。
虽然有栈溢出的风险,但是还好本题的测试用例都没有。
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> notin=new ArrayList<>();
for (int num : nums) {
notin.add(num);
}
return ans(notin);
}
public List<List<Integer>> ans(List<Integer> notin){
Set<Integer> set=new HashSet<>();
List<List<Integer>> ans=new ArrayList<>();
for(int i=0;i<notin.size();i++){
if(!set.contains(notin.get(i))){
List<Integer> newnotin= new ArrayList<>();
newnotin.addAll(notin);
newnotin.remove(i);
List<List<Integer>> append=ans(newnotin);
if(append.size()==0){
List<Integer> tans=new ArrayList<>();
tans.add(notin.get(i));
ans.add(tans);
}else{
for(int j=0;j<append.size();j++){
List<Integer> temp=append.get(j);
List<Integer> tans=new ArrayList<>();
tans.add(notin.get(i));
tans.addAll(temp);
ans.add(tans);
}
}
set.add(notin.get(i));
}else{
continue;
}
}
return ans;
}
}
这种方法大概可以打败40%~50%
未完待续
官方解法
方法
思路
算法