题意:
给一个数组,返回其所有排列。(不重复)
分析:
说明在搜索树种,每下一层,搜素区间就减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; } } } }