leetcode_47. 全排列 II

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

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

示例:

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

二、解题思路

DFS+回溯,注意m_dict存储数字的个数,每次都固定一个数字,然后找子排列。m_dict起到去重的作用。

三、代码

class Solution:
    def permuteUnique(self, nums: list) -> list:
        m_dict = {}
        n = len(nums)

        for num in nums:
            m_dict.setdefault(num, 0)  # only first is 0
            m_dict[num] += 1

        def dfs(index):
            if index == n:
                return [[]]

            res = []
            for num in m_dict:
                if m_dict[num] == 0:
                    continue
                m_dict[num] -= 1
                # next num and index add 1
                res.extend([[num] + res for res in dfs(index + 1)])
                m_dict[num] += 1
            return res
        return dfs(0)


if __name__ == '__main__':
    test = [1, 1, 2]
    s = Solution()
    ans = s.permuteUnique(test)
    print(ans)


悲恋花丶无心之人 CSDN认证博客专家 深度学习 神经网络 Pytorch
计算机视觉在读研究生,熟悉Pytorch,MXNet,TensorFlow,Keras等深度学习框架,主要涉及的领域有目标检测,语义分割,超分辨率重建,行人重识别等。
个人GitHub网址为:https://github.com/nickhuang1996
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值