織夢手機網(wǎng)站圖片谷歌應(yīng)用商店app下載
題目鏈接
給出一組數(shù)字,返回該組數(shù)字的所有排列
例如:
[1,2,3]的所有排列如下
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以數(shù)字在數(shù)組中的位置靠前為優(yōu)先級,按字典序排列輸出。)
思路:
使用回溯,每次選擇一個數(shù)字,畫出回溯二叉樹?;厮莸倪^程中,如果收集過該元素,就跳過,不用對其進行回溯。我這里是通過該元素是否在path數(shù)組中出現(xiàn)過來篩選的,也可以用通用一點的used數(shù)組記錄哪些元素被使用過。(這個used在Day20的題目用到)。
代碼
import copyresult = [] # 全局元素,記錄收集好的路徑
def traverse(nums, path):if len(path) == len(nums): // 當收集的路徑長度等于num長度時,即為收集好了tmp = copy.deepcopy(path) // 注意,一定要使用深拷貝result.append(tmp)returnfor i in range(len(nums)):if nums[i] in path: //如果收集過,就跳過。用是否在數(shù)組中出現(xiàn)過來篩選。continueelse:path.append(nums[i])traverse(nums, path)path.pop()class Solution:def permute(self, num: List[int]) -> List[List[int]]:traverse(num, [])return result
隔三差五還債,終于忙完家里的事情,有精力去刷題了