参考网址: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],tmp
if __name__ == "__main__":
s = Solution()
print s.permuteUnique([1,2,2,2])