原题:Given a collection of distinct numbers, return all possible permutations.
第四十六题允许重复,四十七题不允许;
在解法上有相似的地方;
思路:这道全排列问题可以递归地去做,先确定一个值,对剩下的进行递归;
实际上是一道关于深度优先搜索算法的题目;
参考了这一篇博客:http://blog.csdn.net/chenchaofuck1/article/details/51194976
代码:
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> allLists=new LinkedList<>();
dfs(allLists,nums,0);
return allLists;
}
void dfs(List<List<Integer>> Lists,int[] nums,int s){
if(s==nums.length){
List<Integer> list=new LinkedList<>();
for(int i=0;i<nums.length;i++){
//将一个排好序的序列存储起来;
list.add(nums[i]);
}
Lists.add(list);
}else{
for(int i=s;i<nums.length;i++){
boolean flag=false; //flag部分针对47题,在元素出现重复时不进行交换;
for(int j=s;j<i;j++){ //
if(nums[j]==nums[i]){ //
flag=true; //
} //
} //
if(flag){ //
continue; //
} //
//交换两数字顺序;
int tmp=nums[s];
nums[s]=nums[i];
nums[i]=tmp;
dfs(Lists,nums,s+1);
//交换回来;
nums[i]=nums[s];
nums[s]=tmp;
}
}
}
}
利用flag去除重复的部分实际上是剪枝,将搜索树中一些值去除,不进行计算;