32.2 leetcode - 有重复数据的全排列

来源:互联网 发布:局域网远程软件 编辑:程序博客网 时间:2024/06/05 04:34

参考网址:http://blog.csdn.net/morewindows/article/details/7370155/
去重规则:去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换

#!/usr/bin/python# -*- coding: utf-8 -*-'''Permutations,可能有重复数据的全排列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]]'''class Solution(object):    def permuteUnique(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        length = len(nums)        if length == 0:            return []        ret = []        self.__permuteUnique(nums,0,length,ret)        return ret    def __permuteUnique(self,nums,start,length,ret):        if start == length - 1:            ret.append(list(nums))            return        for index in range(start,length):            if nums[index] in nums[start:index]:#从start 到 index - 1的数据都与start交换过,如果第 index 的数据与前面start 到index - 1中的数据有重复,那么不用交换了                 continue            tmp = nums[start]            nums[start],nums[index] = nums[index],tmp            self.__permuteUnique(nums,start + 1,length,ret)            tmp = nums[start]            nums[start],nums[index] = nums[index],tmpif __name__ == "__main__":    s = Solution()    print s.permuteUnique([1,2,2,2])
0 0