LintCode:15. 全排列(不含重复元素)VS 16. 全排列(含重复元素)

题目:


分析:采用深度优先搜索的递归方法,考虑一个个将元素放入排列中,递归求解,建立一个访问标志数组,记录已经访问过的数,递归终止的条件是排列的长度等于数组的长度时,递归结束。(需要记得回溯)

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);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_27139155/article/details/80567531