【Leetcode】47. 全排列 II

362 阅读1分钟

题目描述

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]

输出:[[1,1,2],[1,2,1],[2,1,1]]

示例 2:

输入:nums = [1,2,3]

输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

回溯法

模板:

void backtracking(参数){
    if(终止条件){
        收集结果;
         return;
    }
    for(集合元素){
        处理节点;
        递归backtracking();
        回溯;
    }
​
}
​

题解


class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> child=new ArrayList<>();
    //记录已经存在结果子集(child)中的元素
    List<Integer> used=new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        backtracking(nums,0);
        List<List<Integer>> list=new ArrayList<>();
        //去重
        Set set = new HashSet();
        set.addAll(res);
        list.addAll(set);
        return list;
    }
    public void backtracking(int[] nums,int index){
        if(child.size()==nums.length){
            res.add(new ArrayList<>(child));
            return;
        }if(child.size()>nums.length){
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(used.contains(i)){
                continue;
            }
            child.add(nums[i]);
            used.add(i);
            backtracking(nums,i+1);
            child.remove(child.size()-1);
            used.remove(used.size()-1);
        }
    }
}

PS:Set去重:


//list为待去重的列表,res为去重后的结果
Set set = new HashSet();
set.addAll(list);
res.addAll(set);