leetcode 第46题 全排列 DFS

这篇博客探讨了如何使用Python实现全排列算法的三种递归方式,分别是基于深度优先搜索(DFS)的传统递归、不使用深度的递归出口判断以及在不改变原数组的情况下进行全排列。每种方法都详细解释了代码逻辑,并强调了各自的特点,特别是第三种方法对于保持子树相对位置不变的优势。
摘要由CSDN通过智能技术生成
class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        全排列
        """
        list_re=[]
        list_curr=[]
        len_nums=len(nums)
        def DFS(deepth):
            if deepth==len_nums:
                list_re.append([i for i in list_curr])
            else:
                for i in range(len(nums)):
                    list_curr.append(nums.pop(0))
                    DFS(deepth+1)
                    nums.append(list_curr.pop())
        DFS(0)
        return list_re
class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        全排列
        """
        list_re=[]
        list_curr=[]
        len_nums=len(nums)
        def DFS():
            if nums==[]:
                list_re.append([i for i in list_curr])
            else:
                for i in range(len(nums)):
                    list_curr.append(nums.pop(0))
                    DFS()
                    nums.append(list_curr.pop())
        DFS()
        return list_re
a=Solution()
nums = [1,2,3,4]
print a.permute(nums)

另一种递归出口的写法,不用深度,而是检查当前栈的元素

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        全排列
        最好是别动原数组
        那么改变状态和还原状态操作最好用一个标志位:Flase代表没有更新 True代表已更新
        """
        list_re=[]
        list_curr=[]
        len_nums=len(nums)
        def DFS(deepth):
            if deepth==len(nums):
                list_re.append([j for j in list_curr])
            else:
                for i in range(len(nums)):
                    if nums_d[i][1]==True:
                        pass
                    else:
                        nums_d[i][1]=True#改变状态
                        list_curr.append(nums_d[i][0])
                        DFS(deepth+1)#递归深度+1
                        nums_d[i][1]=False#还原状态
                        list_curr.pop()
        nums_d=[[i,False]for i in nums]
        DFS(0)
        return list_re

第三种写法,好处是不用改动原数组,因此不改变本层其他子树的相对位置,47题这么做更容易

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值