Permutations II

来源:互联网 发布:快餐店数据流程图 编辑:程序博客网 时间:2024/05/20 08:22

leetcode第47题,全排列的升级版,要求需要全排列的数组中有重复,输出去重后的结果。

这个题可以充分运用语言上的特点,比如先生成带有重复项的全排列,这在之前那道题目已经完成了,然后set一下去重,但是这样做太不自然了,复杂度肯定也会依赖于set去重操作,有没有自然去掉重复项的办法呢?

可以这样考虑,为什么会产生重复项,因为数组中含有重复数字。在每一轮深搜的时候,单独设置一个dict记录用到的数字,如果在碰到相同的数字出现,就会在字典里查出来,这就意味着这个数字不用再进行下一步dfs了,因为已经有一个和它完全相同的数字已经搜索了,这样就自然去重了。

class Solution(object):    def permuteUnique(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        ans = []        def dfs(nums, ans, path):            if not nums:                ans.append(path)            else:                d = {}                for i in xrange(len(nums)):                    if nums[i] not in d:                        dfs(nums[:i]+nums[i+1:], ans, path+[nums[i]])                        d[nums[i]] = 1        nums.sort()        dfs(nums, ans, [])        return ans
0 0