题目描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
样例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
分析:
因为可能包含重复的数字,所有首先对序列排序,使得重复的数字相邻。
这是一个深度搜索的过程。想象每个盒子只能放一个数字,当一个盒子的数字确定之后,排列方式就等于其他数字的放置。当一次排列结束以后,交换数字的放置位置。
设置标志数组flag,flag[i]=false表示第i个数字还未被放置。
//执行用时 : 5 ms, 在Permutations II的Java提交中击败了87.93% 的用户
//内存消耗 : 42.7 MB, 在Permutations II的Java提交中击败了77.57% 的用户
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
if(nums==null)
return list;
List<Integer> l=new ArrayList<>();
boolean []flag=new boolean[nums.length];
Arrays.sort(nums);
dfs(nums,l,flag,list);
return list;
}
private void dfs(int[] nums, List<Integer> l, boolean[] flag, List<List<Integer>> list) {
if(l.size()==nums.length) {
list.add(new ArrayList<>(l));
return;
}
for(int i=0;i<nums.length;i++) {
if(flag[i]==true||i>0&&nums[i]==nums[i-1]&&flag[i-1]==false)
continue;
l.add(nums[i]);
flag[i]=true;//第i个数字已经被放置
dfs(nums,l,flag,list);
flag[i]=false;//第i个数字未被排列
l.remove(l.size()-1);
}
}

博客围绕给定可含重复数字的序列求所有不重复全排列展开。给出样例输入 [1,1,2] 及对应输出,分析求解方法,先对序列排序让重复数字相邻,采用深度搜索,用标志数组标记数字是否放置,一次排列结束后交换数字位置。
419

被折叠的 条评论
为什么被折叠?



