题目:
分析:采用深度优先搜索的递归方法,考虑一个个将元素放入排列中,递归求解,建立一个访问标志数组,记录已经访问过的数,递归终止的条件是排列的长度等于数组的长度时,递归结束。(需要记得回溯)
public class Solution { /* * @param nums: A list of integers. * @return: A list of permutations. */ public List<List<Integer>> permute(int[] nums) { // write your code here List<List<Integer>> res=new ArrayList<>(); if(nums==null) return res; dfs(nums,new boolean[nums.length],new ArrayList<>(),res); return res; } public void dfs(int[]nums,boolean[] visited,List<Integer> permutation, List<List<Integer>>res){ if(permutation.size()==nums.length){ res.add(new ArrayList<>(permutation)); return; } for(int i=0;i<nums.length;i++){ if(visited[i]){ continue; } permutation.add(nums[i]); visited[i]=true; dfs(nums,visited,permutation,res); visited[i]=false;//撤销访问标记 permutation.remove(permutation.size()-1); //撤销上次添加 } } }
题目:
分析:同样用深度优先搜索的方法,因为是含有重复元素,所以可以先对元素进行排序,然后在组合的时候,跳过那些标记位为true的,因为已经访问过,同时,也跳过那些与前一个元素相等并且前一个元素已经访问过的元素。
public class Solution { /* * @param : A list of integers * @return: A list of unique permutations */ public List<List<Integer>> permuteUnique(int[] nums) { // write your code here List<List<Integer>> res=new ArrayList<>(); if(nums==null) return res; Arrays.sort(nums); dfs(nums,new boolean[nums.length],new ArrayList<>(),res); return res; } public void dfs(int[] nums,boolean[] visited,List<Integer> permutation,List<List<Integer>> res){ if(permutation.size()==nums.length){ res.add(new ArrayList<>(permutation)); return; } for(int i=0;i<nums.length;i++){ if(visited[i]){ continue; } if(i>0 && nums[i]==nums[i-1] && visited[i-1]){ continue; } permutation.add(nums[i]); visited[i]=true; dfs(nums,visited,permutation,res); visited[i]=false; permutation.remove(permutation.size()-1); } } };