美文网首页
LintCode 16. 带重复元素的排列

LintCode 16. 带重复元素的排列

作者: CW不要无聊的风格 | 来源:发表于2020-07-13 16:06 被阅读0次

题目描述

给出一个具有重复数字的列表,找出列表所有不同的排列。


测试样例

输入:[1,1]

输出:

[

  [1,1]

]

输入:[1,2,2]

输出:

[

  [1,2,2],

  [2,1,2],

  [2,2,1]

]


解题思路

使用递归DFS,拿出一个数字加入排列中,然后与剩下的数字做组合。这里的关键在于去重!需要先将数字序列进行排序,然后标记每个位置的数字是否在已当前的排列方案中,每次DFS前先将该位置进行标记,DFS完后再取消标记,以便后面的数字可以与前面的数字做组合。

在DFS过程中,若当前位置的数字已标记或者当前位置的数字与前一个位置的数字相同,同时前一个位置未标记,则跳过。这里或许需要多想一下,为什么需要“前一个位置未标记”这个条件?

前面提到过,每个位置的数字在其DFS完后会取消对应的标记,于是“前一个位置未标记”就代表当前位置的数字在此刻的排列方案中排在了前一个位置的数字前面,而这种方案肯定已被前一个数字的DFS过程给覆盖了,于是可直接跳过,不必进行重复处理。


代码

class Solution:

    """

    @param: :  A list of integers

    @return: A list of unique permutations

    """

    def permuteUnique(self, nums):

        result = []

        # 记录每个位置的数字是否在当前排列中已使用

        in_use = [False] * len(nums)

        # 注意将nums排序

        self.dfs(sorted(nums), [], result, in_use)

        return result

    def dfs(self, nums, tmp, result, in_use):

        if len(tmp) == len(nums):

            result.append(tmp)

            return

        for i, n in enumerate(nums):

            # 若当前位置的数字已在排列当中,则跳过;

            # 或者当前位置的数字作为排列的第一个数字

            # 且与前一个位置的数字相同时,也跳过

            # 这里in_use[i - 1]为False说明当前位置的数字

            # 在当前的排列方案中排列在前一个位置的数字前,

            # 否则若前一个位置的数字排列在当前位置的数字前的话,

            # in_use[i - 1]绝对为True

            if in_use[i] or (i and n == nums[i - 1] and not in_use[i - 1]):

                continue

            in_use[i] = True

            self.dfs(nums, tmp + [n], result, in_use)

            in_use[i] = False

相关文章

  • LintCode 16. 带重复元素的排列

    题目描述 给出一个具有重复数字的列表,找出列表所有不同的排列。 测试样例 输入:[1,1]输出:[ [1,1]] ...

  • 排列类算法问题大总结

    全排列 带重复元素的排列 下一个排列 上一个排列 第 k 个排列 排列序号 排列序号II 全排列 给定一个数字列表...

  • 全排列

    递归不支持字典序,只支持全排列 1. 不含重复元素的全排列 2. 含重复元素 非递归处理 支持处理重复元素(不包含...

  • 排列组合递归版优化

    带重复元素的全排列的递归实现 在编程实现时,在交换第i个元素与第j个元素之前,要求数组的区间中的元素没有与第j个元...

  • 全排列 包含重复元素和不包括重复元素

    全排列不包含重复元素 publicLinkedListres=newLinkedList(); publicLis...

  • Java集合

    List,Queue存储的元素是排列有序的,并且可以重复的,Set中的元素是无序并且不可重复的; List和Set...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • lintcode 全排列

    给定一个数字列表,返回其所有可能的排列,第十五题是没有重复的数字,是十六题是有重复的数字。先来说没有重复数字的情况...

  • Python基础手册10——序列(字符串)

    Sequences(序列) Python的序列类型具有以下特点:成员元素有序排列,个数有限,可重复 。序列包括: ...

  • LintCode 删除数组中的重复元素

    题目 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 不要使用额...

网友评论

      本文标题:LintCode 16. 带重复元素的排列

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