[Leetcode解題] Permutations - 遞迴/backtrace解
11 February 2022
medium
recursion
backtrace
題目
46. Permutations 這是一個數組的排列組合題。給定一個元素獨一無二的數組,求出所有可能的排列。
解題思路
這道題可以使用回溯算法來解決,解題思路如下:
回溯法是一種通過搜索所有可能的解來找到所有可能解的一种方法。我們可以在數組的每個位置上選擇一個數字,然後對剩下的數字進行遞歸搜索,找到所有可能的排列。
算法流程
- 建立一個空列表,用於存儲當前排列
- 在數組中選擇一個數字,加入到列表中
- 對剩下的數字進行遞歸搜索
- 如果列表長度等於數組長度,就將當前排列加入結果列表
- 否則,對剩下的數字進行遞歸搜索
- 刪除列表中的最後一個元素,以便返回上一個狀態
- 重複2-6步,直到所有排列都被找到
實作
以下是一個使用回溯法的 Python 解決方案:
class Solution:
def permute(self, nums):
def backtrack(first=0):
if first == n:
output.append(nums[:])
for i in range(first, n):
nums[first], nums[i] = nums[i], nums[first]
backtrack(first + 1)
nums[first], nums[i] = nums[i], nums[first]
n = len(nums)
output = []
backtrack()
return output
代碼說明:
- 定義一個名為 backtrack 的函數,用於進行回溯搜索。
- 如果當前位置 first 等於數組長度 n,則將當前排列加入結果列表 output。
- 在數組的剩下部分中遍歷每個數字,並交換當前位置的數字和遍歷到的數字。
- 對剩下的數字進行遞歸调用 backtrack 函数,找到所有可能的排列。
- 交換回原來的數字,以便回溯到上一個狀態。
- 返回結果列表。
複雜度
由於所有整數均為唯一的,則時間複雜度為 $O(n! / (n1! * n2! * … * nk!))$,其中 $n!$ 表示 $n$ 的階乘,$ni$ 表示數字 $i$ 在數組中的出現次數。因此,如果所有整數均為唯一的,則時間複雜度將等於 $O(n!)$。