美文网首页
LeetCode 47 全排列II

LeetCode 47 全排列II

作者: 嗷嗷嗷嗷_ | 来源:发表于2020-09-18 10:24 被阅读0次

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

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

思路 + 代码

本题很容易想到要用 深度遍历+回溯剪枝 来进行解答,主要难点在于所给数组中存在相同数字,即如何在回溯过程中就剪枝去重
首先对数据升序排列,在同一层递归中,如果后面一个数字和前面一个数字一样,且这两个数字都没被使用过,在for循环中,后面这个数字就可以直接跳过,没必要再重复一次dfs。

剪枝思路示例
class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {

        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList();
        List<Integer> path = new ArrayList();
        boolean[] used = new boolean[nums.length]; //记录某元素是否已经使用过

        dfs(nums,0, nums.length,used, res, path);

        return res;
    }

    public void dfs(int[] nums, int depth, int len, boolean[] used, List<List<Integer>> res, List<Integer> path){
        if (depth == len){ 
            // 成功条件
            res.add(new ArrayList(path));
            return;
        }

        for (int i = 0; i < len; i++){
            if (used[i]) continue; // 已经用了直接过
           
            // 剪枝核心,
            if (i > 0 && nums[i] == nums[i-1] && !used[i-1]) continue;
            
            // 递归以及回溯主代码
            used[i] = true;
            path.add(nums[i]);
            dfs(nums, depth + 1, len, used, res, path);
            path.remove(path.size()-1);
            used[i] = false;
        }
    }
}

相关文章

  • 47. 全排列 II

    47. 全排列 II[https://leetcode.cn/problems/permutations-ii/]...

  • 47. 全排列 II、39. 组合总和、40. 组合总和 II

    回溯的题 47. 全排列 II[https://leetcode-cn.com/problems/permutat...

  • LeetCode 47 全排列II

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

  • LeetCode - #47 全排列 II

    前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤...

  • Leetcode 47 全排列 II

    题意:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 解法:1.审题可知,其实就是...

  • LeetCode - 47. 全排列 II

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

  • [LeetCode][M] 47. 全排列 II

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

  • LeetCode 第 47 题:全排列 II

    思路分析: 这一题是在 「力扣」第 46 题:“全排列” 的基础上增加了“序列中的元素可重复”这一条件。因此我们还...

  • LeetCode 第 47 题:全排列 II

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

  • 排列,组合,子集专题

    排列组合的题用回溯法和递归基本可以解决,总结一下。46.全排列 47.全排列II 47比46多了个序列可重复的条件...

网友评论

      本文标题:LeetCode 47 全排列II

      本文链接:https://www.haomeiwen.com/subject/ckbdyktx.html