zoukankan      html  css  js  c++  java
  • 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的一个拓展,主要是当原数组有重复元素的时候,如果依然按permutations的做法,则会产生重复的排列。比如[1,1,2]的数字,如果首先选择了第一个1,然后是第二个1,再是2和先选择第2个1,再选择第二个1,然后再选择2的结果是一样的。必然产生重复。所以对于这种情况,需要进行重复排除。首先输入的数组不一定有序,如果无序,先进行排序,之后在每一步的选择中,只选择重复数字的第一个数字作为一步,后面的一样的数字则不做操作。避免上述的重复情况。代码相比permutation的代码只需要增加一行,如下:

    class Solution(object):
        def permuteUnique(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            if not nums:
                return [[]]
            nums.sort()
            allPer = []
            per = []
            used = [False] * len(nums)
            self.helper(nums, used, per, allPer)
            return allPer
            
        def helper(self, nums, used, per, allPer):
            if len(per) == len(nums):
                allPer.append(per+[])
                return 
            
            for i in xrange(len(nums)):
                if used[i]: continue
                if i > 0 and nums[i] == nums[i-1] and not used[i-1]: #排除重复,对于每一步只取重复元素中的第一个。
                    continue
                per.append(nums[i])
                used[i] = True
                self.helper(nums, used, per, allPer)
                per.pop()
                used[i] = False
  • 相关阅读:
    过滤器(Filter)
    DBUtils结果集处理器介绍
    Tomcat配置连接c3p0连接池
    JdbcUtils
    数据库连接池
    JDBC处理事务
    JDBC入门(5)--- 时间类型、大数据
    JDBC入门(4)--- 批处理
    JDBC入门(3)--- PrepareStatement
    JDBC入门(2)--- ResultSet之滚动结果集
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5567096.html
Copyright © 2011-2022 走看看