【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/

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