题意:
给一个数组,返回其所有排列。(不重复)
分析:
说明在搜索树种,每下一层,搜素区间就减1(减掉的那个1,就是父节点本身)
以上能得到所有排列
但是由于数组中可能有相同的元素,所以排列可能有相同的。
所以,可以利用排序,并只将相同元素的第一个进入搜索的方式去掉相同的。
public class Solution {
List<Integer> l = null;
List<List<Integer>> list = null;
public List<List<Integer>> permuteUnique(int[] nums) {
l = new ArrayList<>();
list = new ArrayList<>();
Arrays.sort(nums);
boolean[] visited = new boolean[nums.length];
dfs(nums, visited);
return list;
}
private void dfs(int[] nums, boolean[] visited){
if(l.size() == nums.length){
list.add(new ArrayList(l));
return;
}
for(int i=0; i<nums.length; i++){
if (!visited[i]) {
if (i > 0 && nums[i] == nums[i-1] && visited[i-1]) {
continue;
}
visited[i] = true;
l.add(nums[i]);
dfs(nums, visited);
l.remove(l.size()-1);
visited[i] = false;
}
}
}
}