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

102 篇文章 0 订阅
70 篇文章 0 订阅

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

动态规划:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值