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

参考网址: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])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值