网站建设智推网,平面设计网站灵感,濮阳做网站优化,90设计网页版添加链接描述
class Solution:def permute(self, nums: List[int]) - List[List[int]]:# 思路是使用回溯if not nums:return []def dfs(path,depth,visited,res):# 出递归的条件是当当前的深度已经和nums的长度一样了#xff0c;把path加入数组#xff0c;然后出递归if …添加链接描述
class Solution:def permute(self, nums: List[int]) - List[List[int]]:# 思路是使用回溯if not nums:return []def dfs(path,depth,visited,res):# 出递归的条件是当当前的深度已经和nums的长度一样了把path加入数组然后出递归if len(nums)depth:res.append(path[:])return for i in range(len(nums)):if visited[i]False:visited[i]Truepath.append(nums[i])dfs(path,depth1,visited,res)path.pop()visited[i]Falsevisited[False]*len(nums)res[]dfs([],0,visited,res)return res 思路 这是一道很能体现回溯思想的题目很容易想到这样的解题思路[1][2,3]也就是先选出一个把后面的进行递归 在选择了[1,2,3]之后要进行回溯就是把之前加入path中的弹出然后再重置标志 回溯结束条件是当当前depth等于数组长度时就进行收获操作这里是否有return都无所谓因为是对叶子节点加入res的操作 所以定义的func的参数有当前深度depth用来记录当前结果的path一个visited数组用来排除已经访问过的元素也就是将已经在路径上的节点排除出去res用来接收总结果
出递归时为什么使用path[:]而不是path本身
变量 path 所指向的列表 在深度优先遍历的过程中只有一份 深度优先遍历完成以后回到了根结点成为空列表。
引用传递和拷贝pathpath[:]
在Python中列表是可变对象而可变对象在函数参数传递时是通过引用传递的方式进行的。这意味着当你将一个列表作为参数传递给一个函数时函数内部操作的是这个列表对象的引用而不是列表对象的副本。当你在函数内部修改了传入的列表对象时这些修改会直接影响到原始列表因为它们指向同一个对象。这种行为称为引用传递或者叫按引用传递。
def modify_list(some_list):some_list.append(4) # 在传入的列表末尾添加一个元素my_list [1, 2, 3]
modify_list(my_list)
print(my_list) # 输出 [1, 2, 3, 4]
在这个例子中modify_list函数内部的操作直接影响了原始的my_list列表因为传递的是my_list的引用。但是在回溯或递归等需要对列表进行多次修改并且保存不同状态的情况下我们可能需要确保每个状态的独立性避免相互影响。这时候可以使用list.copy()或[:]切片操作创建列表的副本以便在函数调用或操作过程中不影响原始列表。