python全排列

1.所给数字列表无重复数字:[1,2,3]   回溯法:将每个位置的数字与第一个位置的数字互换,然后求得剩下的数字的全排列,结合递归算法就可以求出数列的全排列

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        def pm(res, l, r, n, max):
            if n == max:
                res.append(l)
            for i in range(0, len(r)):
                pm(res, l+[r[i]], r[:i]+r[i+1:], n+1, max)
                
        pm(res, [], nums, 0, len(nums))
        return res

 

 

 2.所给列表有重复数字:[1,2,1]

先把列表排序,让重复数字相邻;利用vt列表,判断该数字是否有相同并且已经处理过,为真则跳过,否则继续进入递归。

class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        nums.sort()
        vt = [0]*len(nums)
        val = []
        def pu(res, nums, val, vt):
            import pdb;pdb.set_trace()
            if len(val) == len(nums):
                res.append(val)
            for i in range(0, len(nums)):
                if i > 0 and nums[i] == nums[i-1] and vt[i - 1] == 0:
                    continue
                if vt[i] == 0:
                    vt[i] =1
                    pu(res, nums, val+[nums[i]], vt)
                    vt[i] = 0
        pu(res, nums, val, vt)
        return res

if __name__ == "__main__":
    st = Solution()
    print st.permuteUnique([1,3,1])
    

 

posted @ 2017-07-06 10:13  lirenhong  阅读(2736)  评论(0编辑  收藏  举报