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

示例:

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

 

思路:

47. 全排列 II

借鉴了别的博客的这张图。

深度优先搜索的思路(循环中递归)

全排列的产生过程:

每次检查当前位置能改变的值的个数依次是n*n-1****1   ,如何实现呢?

从当前位置i开始,向后遍历j直到最后一个数,每次与第i位置的数交换(为了去重,必须判断nums[j]是否已经交换过,可用一个list来保存已经出现过得发生交换的值)

递归实现:

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
#         思路:遍历每个位置 把当前位置和后面的位置交换(还未交换过的值才交换避免重复)
# 递归结构
        n=len(nums)
        if n<2:return [nums]
        res=[]
        self.permute(nums,n,0,res)
        return res 
    
    def permute(self,nums,n,start,res):
        if start>=n-1:
            res.append(nums[:])
            return
        i=start
        used=[]
        while i<n:
            if nums[i] not in used:
                nums[i],nums[start]=nums[start],nums[i]
                self.permute(nums,n,start+1,res)
#                 注意一次交换完后,要还原数组
                nums[i],nums[start]=nums[start],nums[i]
                used.append(nums[i])
            i+=1
        

 

相关文章:

  • 2021-07-25
  • 2021-08-26
  • 2021-05-24
  • 2021-07-10
  • 2021-08-16
  • 2021-12-09
  • 2021-11-19
  • 2022-12-23
猜你喜欢
  • 2022-01-14
  • 2021-10-11
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案