47. 全排列 II(含重复数字的全排列)

与不含重复数字的全排列相比,在于:
排序;
添加对上一数字的判断

class Solution {
    LinkedList<List<Integer>> ans=new LinkedList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permuteUnique(int[] nums) {
      used=new boolean[nums.length];
      Arrays.sort(nums);//全排列去重,这是关键
      dfs(nums,0);
      return ans;

    }
    void dfs(int[] nums,int cnt){
        if(cnt==nums.length){
            ans.add(new LinkedList(path));
            return;
        }

        for(int i=0;i<nums.length;i++){
            if(i>0&&nums[i]==nums[i-1]&&!used[i-1])//上一个数字和本数字相同,且上一个数字没有被访问。
            //那么本次的搜索一定是重复的
                 continue;
            if(!used[i]){
                used[i]=true;
                path.add(nums[i]);
                dfs(nums,cnt+1);
                used[i]=false;
                path.removeLast();
            }
        }

    }
}

含重复元素不好用交换法吧。看了一下,为了防止同一层递归有重复元素,对每一层递归都申请了一个HashSet...感觉效果还不如用used方便呢
相关题解

posted @ 2021-04-24 19:23  wsshub  阅读(135)  评论(0)    收藏  举报