Given a collection of distinct integers, return all possible permutations.算法
Example:app
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
回溯算法本身的一個思路以下:須要保留數字使用狀況,my_nums增長和刪除元素等操做
1 class Solution: 2 def permute(self, nums: List[int]) -> List[List[int]]: 3 results = [] 4 use_dict = dict.fromkeys(nums, False) #初始化一個字典,保存數字是否使用過 5 def backtrack(results, my_nums, use_dict): 6 if len(my_nums) == len(nums): 7 tmp_nums = copy.deepcopy(my_nums) 8 results.append(tmp_nums) 9 return 10 11 for x in nums: 12 if not use_dict[x]: 13 use_dict[x] = True 14 my_nums.append(x) 15 backtrack(results, my_nums, use_dict) 16 my_nums.remove(x) #remove操做耗費時間 17 use_dict[x] = False 18 backtrack(results, [], use_dict) 19 return results
總體程序花費時間較多,remove處消耗太多時間, 超過24%左右spa
改良版:code
1 class Solution: 2 def permute(self, nums: List[int]) -> List[List[int]]: 3 results = [] 4 len_n = len(nums) 5 def backtrack(my_nums, use_nums): 6 if len(my_nums) == len_n: 7 results.append(my_nums) 8 return 9 for i in range(len(use_nums)): 10 x = my_nums.copy() 11 x.append(use_nums[i]) 12 backtrack(x, use_nums[:i]+use_nums[i+1:]) 13 backtrack([], nums) 14 return results
這個每次遞歸會縮小剩下可用數字範圍,不須要維護數字使用dictblog
my_nums每次都copy一份,這樣就不須要remove操做了,運行時間縮短。 遞歸
超過98%以上Python速度leetcode
---最近轉戰英文leetcode站了,因此題目變成了英文描述