【LeetCode】46. 排列

问题描述

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

给定一组不同的整数,返回所有可能的排列。

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

 

Python 实现

实现一:递归实现。根据排列的数学定义,求一组整数的排列,可以看做是依次选出一个整数后,分别与去掉该整数后剩下的这一组整数排列的结果进行组合。这也是分治法的思想,把大问题逐层向下分解成小问题,每一层小问题的结果组合起来就能解答目标问题。因此我们可以定义一个递归函数,用于求输入数组的排列,具体见以下代码:

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        
        ret = []
        
        def subPermute(nums, arr):
            if nums == None or len(nums) == 0:
                ret.append(arr)
                return
            
            for i in range(len(nums)):
                subPermute(nums[:i] + nums[i+1:], arr+[nums[i]])
        
        subPermute(nums, [])
        return ret

实现二:迭代实现。能用递归实现的算法基本都可以写成迭代的形式,这里为了更好的理解,思路上稍微做一点调整。同样是分解成求子数组的排列,假设我们已经求出了某个子数组的排列,给到下一个新的整数时,新的子问题就是在当前的排列结果得到新的排列结果,那我们可以把这个新整数依次插入在每个排列的结果的不同位置,这样就能得到到达该整数时,排列的结果。

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """

        if nums == None or len(nums) == 0:
            return [[]]
        
        ret = [[nums[0]]]
        
        idx = 1
        while idx < len(nums):
            tmp = []
            # Iterate each temperory permution result.
            for perm in ret:
                # Insert new number into each temperory permution result.
                for i in range(idx+1):
                    tmp.append(perm[:i] + [nums[idx]] + perm[i:])
            # Update the subpermution result and index.
            ret = tmp
            idx += 1
        return ret

 

链接:https://leetcode.com/problems/permutations/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章