1. 程式人生 > >動態規劃,分治,回溯法,全排列,切片

動態規劃,分治,回溯法,全排列,切片

全排列問題,可以從動態規劃狀態方程考慮,也可以從回溯法考慮,二者程式碼遞迴形式的程式碼是一致的,但是理解的角度不同

動態規劃:

# 基於動態規劃,狀態方程考慮,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)

注意python複製陣列注意使用切片,如果是複製資料,或者把資料加入到一個列表裡,千萬要使用切片,不要使用其名稱,python里名稱是指標,後續資料變化了,列表裡面的資料也會變化。