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
海康威视公司福利 1257人发布