[leetcode] 47. Permutations II @ python

版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/88073250

原题

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example:

Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

解法1

使用itertools.permutations返回排列组合, 然后将结果放入集合中, 最后将集合转化为列表

代码

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        ans = set(tup for tup in itertools.permutations(nums))
        return list(ans)

解法2

DFS.使用DFS将所有组合都放入结果里, 然后使用集合去掉重复值.

代码

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def dfs(nums, path, res):            
            if len(nums) == 0:
                res.append(path)
                return
            for i in range(len(nums)):                
                dfs(nums[:i] + nums[i+1:],path + [nums[i]], res)
            
        nums.sort()
        res = []
        dfs(nums, [], res)
        res = set(tuple(l) for l in res)
        return list(res)

解法3

DFS + backtracking. 定义DFS函数, 回溯的条件是当nums长度为0时, 表示我们已经取完所有数字了, 此时将path加到结果里, 然后遍历nums, 当nums[i] == nums[i-1]时, 使用continue去掉重复值.

代码

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def dfs(nums, path, res):            
            if len(nums) == 0:
                res.append(path)
                return
            for i in range(len(nums)):
                if i > 0 and nums[i]==nums[i-1]:
                    continue
                dfs(nums[:i]+nums[i+1:], path+[nums[i]], res)                
            
        nums.sort()
        res = []
        dfs(nums, [], res)
        return res

猜你喜欢

转载自blog.csdn.net/danspace1/article/details/88073250