leetcode 46 Permutations Python 實現(回溯算法)

 

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站了,因此題目變成了英文描述
相關文章
相關標籤/搜索