【leetcode】(puthon) 47. Permutations II 排列II

Description

  1. Permutations II Medium

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

这题在46. Permutations 排列的基础上加了要求,数组元素可能重复,刚开始的思路就是直接加一个判断条件,如果path不在res中,才能加入结果列表res中。当然,这样做的效率不高。

code

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

思路2

先将该数组排序,以确保相同元素是挨在一起且连续的,然后遍历时判断该数是否与前数相同,如果相同则继续。后面的思路与46题排列相同。

code

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

一个下午又过去了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值