题解 | #有重复项数字的全排列#

有重复项数字的全排列

https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

import java.util.*;

public class Solution {

    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        //先使数组保持一个递增方向  利于字典序升序排序
        Arrays.sort(num);
        
        dfs(num,list,new boolean[num.length]);
        return res;
    }
    //思路还是使用dfs进行全排列 ,进行适当剪枝
    public void dfs(int num[] ,ArrayList<Integer> list ,boolean []used){
        if(list.size() == num.length) {
            res.add(new ArrayList<>(list));
            return ;
        }

        for(int i = 0 ; i < num.length ; i++){
            //当前数字正在被使用
            if(used[i]) continue; 
            //如果当前这个数和上一个数相等 没有保持一个递增方向 并且上一个数已经没有被使用了
            //则这次情况和上次的相同 进行剪枝
            if(i > 0 && num[i - 1] == num[i] && !used[i-1]) continue;

            //否则 进行dfs
            used[i] = true;
            list.add(num[i]);
            dfs(num,list,used);
            list.remove(list.size()-1);
            used[i] = false;
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
02-14 11:10
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务