No.47全排列II

题目大意

给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

分析

这个题只要在全排列I的基础上加一个去重操作,而这个去重操作需要注意效率。可以用Set去重,但是效率较低;可以在permutation的时候加入判断,直接去掉造成重复的交换。

代码一:Set去重

    List path = new ArrayList<>();
    List> res = new ArrayList<>();

    public List> permuteUnique(int[] nums) {
        if(nums==null || nums.length == 0) return res;
        permuteCore(nums,0);
        res = removeDup(res);
        return res;
    }

    private void permuteCore(int[] nums, int pos) {
        if(pos == nums.length-1) {
            for(int i=0;i();
            //path.clear();
            return;
        } else {
            for(int i=pos;i> removeDup(List> list) {
        //给list去重
        HashSet> set = new HashSet<>();
        List> r = new ArrayList<>();
        for(int i=0;i

运行时间39ms,击败17.82%.

代码二:判断条件

    List> res = new ArrayList<>();
    public List> permuteUnique(int[] nums) {
        if(nums==null || nums.length == 0) return res;
        permuteCore(nums,0);
        return res;
    }
    
    private void permuteCore(int[] nums, int pos) {
        if(pos == nums.length-1) {
            List path = new ArrayList<>();
            for(int i=0;i

运行时间1ms,击败100%。

你可能感兴趣的:(No.47全排列II)