Permutations II

题目

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

For example,
[1,1,2]have the following unique permutations:

[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

思路分析

这道题跟permutations I的最大区别是这道题的input数组中包含重复的元素。那么相对于permutations I就要在多一层去重,所以有两层去重

第一层去重:类似于permutations I,避免同一个元素在排列数组中被多次使用,通过visited数组来实现调用递归函数的时候不要再使用上一层使用的数字

第二层去重:因为输入数组中有重复的元素,所以当数字第一次出现的时候相应的排列数组都已经放在result中,当同样的数字第二次出现的时候就没有必要在做相同的操作而直接pass即可。这一层去重一般是通过对原始数组排序,然后判断当前的元素是不是与上一个元素相同来完成的。但是这道题除了这两个条件以外,还有多一个判断条件,不然的话有些valid的排列数组也被filer掉了。这个条件就是判断前一个元素是不是被visited过,如果visited=True,说明现在正在查找上一个元素开始的所有排列数组,那么这个元素虽然与上个元素一样,但是也要放在排列数组中;如果visited=False,说明之前的元素已经查找完了所有以它开始的排列数组,因为当前元素与之前元素一样,所以这个时候就没有必要再为当前元素查找排列数组了。

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def dfs(nums, length, visited, path, result):
            if length == 0:
                result.append(path)
                return
            for i in range(0, len(nums)):
                if visited[i]: continue
                if i>0 and nums[i] == nums[i-1] and not visited[i-1]: continue    <<<<<<<<
                visited[i] = True
                dfs(nums, length-1, visited, path+[nums[i]], result)
                visited[i] = False
        len_nums = len(nums)
        result = []
        visited = len_nums * [False]
        dfs(sorted(nums), len_nums, visited, [], result)
        return result

results matching ""

    No results matching ""