1. 程式人生 > >LeetCode演算法題46:全排列解析

LeetCode演算法題46:全排列解析

給定一個沒有重複數字的序列,返回其所有可能的全排列。

示例:

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

這個題突然讓我又對遞迴產生了新的認識,遞迴可以是不確定層數的巢狀迴圈。。。所以這個題還是用遞迴來解,思路還是深度優先搜尋,其實想還是很好想的,和之前那個組合總和很像,有些區別就是這個遞迴的還是所有的數字,但是已經取到的要排除掉,所以這裡只好打個標記。
C++原始碼:

給定一個沒有重複數字的序列,返回其所有可能的全排列。

示例:

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

python3的程式碼用另一種方法,依舊是遞迴,只是這裡是不斷的交換兩個數字,如果想不太通的話,可以只想三個數的情況,三個數就是先取第一個數,然後這種情況下先可以交換後面兩個數就有了兩種情況,然後第一個數和第二個數交換有了一種情況然後在這種情況下第二個數和第三個數交換就可以一共有兩種情況,同理第一個數和第三個數交換也可以有兩種情況。實際順序如下:

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

python3原始碼:

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        self.permuteDFS(nums, 0, res)
        return res
    
    def permuteDFS(self, nums, start, res):
        if start>=len(nums)
: res.append(copy.deepcopy(nums)) return for i in range(start, len(nums)): nums[start], nums[i] = nums[i], nums[start] self.permuteDFS(nums, start+1, res) nums[start], nums[i] = nums[i], nums[start]