leetcode 46 全排列

通过回溯算法,在纸上画出求解问题的树形图,想清递归结构考虑如何剪枝。

做题的时候,建议 先画树形图 ,画图能帮助我们想清楚递归结构,想清楚如何剪枝。拿题目中的示例,想一想人是怎么做的,一般这样下来,这棵递归树都不难画出。

在画图的过程中思考清楚:

分支如何产生;
题目需要的解在哪里?是在叶子结点、还是在非叶子结点、还是在从跟结点到叶子结点的路径?
哪些搜索会产生不需要的解的?例如:产生重复是什么原因,如果在浅层就知道这个分支不能产生需要的结果,应该提前剪枝,剪枝的条件是什么,代码怎么写?

!!!#需要注意得到数组的浅复制,尤其是python

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:

        def dfs(index,path,result):
            if index==len(nums):
                result.append(path[:])#注意这个地方,得到path数组的浅复制

                return

            for i in range(len(nums)):
                if nums[i] in path:continue
                path.append(nums[i])
                dfs(index+1,path,result)
                path.pop()#path[:]=path[:-1]

        path=[]
        result=[]
        dfs(0,path,result)
        return result

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

递归,每次通过path+[]来进行复制,构造一个新的空间,不用回溯。

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:

       def dfs(i,path,result):
           if i==len(nums):
               result.append(path)

               return
           for j in range(len(nums)):
                if nums[j] in path:continue
                dfs(i+1,path+[nums[j]],result)

       result=[] 
       dfs(0,[],result)
       return result
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务