動態規劃,分治,回溯法,全排列,切片
阿新 • • 發佈:2018-12-31
全排列問題,可以從動態規劃狀態方程考慮,也可以從回溯法考慮,二者程式碼遞迴形式的程式碼是一致的,但是理解的角度不同
動態規劃:
# 基於動態規劃,狀態方程考慮,f[n] = 首位為所有元素 + f[n-1],這個動態規劃沒有重複
# 子問題,每一種情況都需要遍歷
class Solution2:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result =[]
end = len(nums)
def permute_recursion(nums,start):
# 遞迴的出口,就是隻剩一個元素時
if start == end-1:
result.append(nums[:])
# 把每一個元素放在首位,其他的做全排列
for i in range(start,end):
nums[i],nums[start] = nums[start],nums[i]
permute_recursion( nums,start+1)
nums[i],nums[start] = nums[start],nums[i]
return result
return permute_recursion(nums,0)
回溯法,全排列的回溯法:
# 注意python複製陣列注意使用切片
# 基於回溯法考慮
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result =[]
num = len(nums)
def backtracking(depth,nums):
if depth == num-1:
result.append(nums[:])
else:
for i in range(depth,num):
nums[i],nums[depth] = nums[depth],nums[i]
backtracking(depth+1,nums)
nums[i],nums[depth] = nums[depth],nums[i]
return result
return backtracking(0,nums)