判重的全排列递归实现
1.主要思想:首先把数组sort一下,使相同的元素相邻
2.保证相同的数字相对顺序不改变,就不会出现重复的可能
- 解决办法:在递归函数中检查当前数字是否和前面的数字相等,如果相等且前面的数字被访问过,这个数字才能用
- 如果不符合以上条件,说明不可用,跳过该数字
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
int[] path;
int[] visited;
List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0) return new ArrayList<List<Integer>>();
int n = nums.length;
path = new int[nums.length];
visited = new int[nums.length];
Arrays.sort(nums);
dfs(nums,0);
return res;
}
public void dfs(int[] nums, int pos) {
if(nums.length==pos) {
List<Integer> list = new ArrayList<Integer>();
for(int i:path){
list.add(i);
}
res.add(list);
}
//放数字
for(int i=0;i<nums.length;i++){
if(visited[i]==0){
if(i>0&&nums[i]==nums[i-1]&&visited[i-1]==0)
continue; //如果当前数字等于前一个数字且前一个数字没有被访问过,跳过该数字
visited[i]=1;
path[pos]=nums[i];
dfs(nums,pos+1);
visited[i]=0;
}
}
}
}