leetcode: 递归 46.47 Permutations I II

题目 46 Permutations I

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]

Output:

[

 [1,2,3],
        [1,3,2],
        [2,1,3],
        [2,3,1],
        [3,1,2],
        [3,2,1]
       ]

思路 

对于n个数,相当于先对前 n-1 个数排列,然后再把最后这个数插入到不同的位置

    def permute(self, nums: List[int]) -> List[List[int]]:
        if len(nums) == 0:
            return []
        elif len(nums) == 1:
            return [[nums[0]]]
        
        ans = []
        temp = self.permute(nums[1:])
        for item in temp:
            for i in range(len(item)+1):
                p = item.copy()
                p.insert(i,nums[0])
                ans.append(p)
    
        return ans    

题目 47 Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example:

    Input: [1,1,2]
    Output:
    [
       [1,1,2],
       [1,2,1],
       [2,1,1]
    ]

思路

同样也是递归插入,不过在对每一项插入新数字时,如果遇到了与插入数字相同的数字,就可以终止了。因为对后面的空位而言,在上一次插入该数字时已经考虑过了,并列在了当前项中。

    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        if len(nums) == 0:
            return []
        elif len(nums) == 1:
            return [[nums[0]]]
        
        nums.sort()
        ans = []
        temp = self.permuteUnique(nums[1:])
        for item in temp:
            for i in range(len(item)+1):
                p = item.copy()
                p.insert(i,nums[0])
                ans.append(p)
                if i<len(item):
                    if nums[0] == item[i]:
                        break
        return ans               
发布了45 篇原创文章 · 获赞 1 · 访问量 3363

猜你喜欢

转载自blog.csdn.net/qq_22498427/article/details/104565582