lintcode練習-16.重複する要素の配置


16.繰り返し要素の配置
重複する数値を持つリストを与え、リストのすべての異なる配列を見つけます.
サンプル
リスト[1,2,2]が与えられ、異なる配列は以下の通りである.
[
  [1,2,2],
  [2,1,2],
  [2,2,1]
]

に挑戦
再帰と非再帰を使用して、この問題をそれぞれ完了します.
問題解決の考え方:
class Solution:
    """
    @param: :  A list of integers
    @return: A list of unique permutations
    """

    def permuteUnique(self, nums):
        # write your code here
        self.res = []
        if nums == None:
            return self.res
        
        nums = sorted(nums)
        #     ,         
        self.dfs(nums, [False for x in range(len(nums))], [])
        
        return self.res
    
    
    def dfs(self, nums, boolean, permutation):
        if len(permutation) == len(nums):
            self.res.append(permutation[:])
            return
        
        for i in range(0, len(nums)):
            #       ,    
            if boolean[i]:
                continue
            
            if i > 0 and nums[i] == nums[i-1] and boolean[i-1] == False:
                continue
            
            permutation.append(nums[i])
            boolean[i] = True
            self.dfs(nums, boolean, permutation)
            
            boolean[i] = False
            permutation.pop()