动态规划,分治,回溯法,全排列,切片

全排列问题,可以从动态规划状态方程考虑,也可以从回溯法考虑,二者代码递归形式的代码是一致的,但是理解的角度不同

动态规划:

# 基于动态规划,状态方程考虑,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里名称是指针,后续数据变化了,列表里面的数据也会变化。

猜你喜欢

转载自blog.csdn.net/weixin_40759186/article/details/85212137