回溯算法和深度优先遍历
回溯法采用试错的思想,它尝试分布的去解决一个问题。在分布解决问题的过程中,当它通过尝试发现现有的分布答案不能得到有效的正确的解答的时候,它将取消上一步甚至上级不的计算,再通过其他的可能的分布解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
- 1、找到一个可能存在的正确答案;
- 2、在尝试了所有可能的分布方法后宣告该问题没有答案;
深度优先搜索算法是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当结点V所在边都已被探寻过,搜索将回溯到发现节点V的那条边的起始节点。这一过程一直进行到已发现从源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
46.全排列
题目链接
46. 全排列 - 力扣(LeetCode)
解题代码
class Solution:def permute(self, nums: List[int]) -> List[List[int]]:def dfs(x):if x == len(nums) - 1:res.append(list(nums))returnfor i in range(x,len(nums)):nums[i],nums[x] = nums[x],nums[i]#交换将nums[i]固定在第x位置dfs(x + 1)nums[i],nums[x] = nums[x],nums[i]#恢复交换res = []dfs(0)return res
78.子集
题目链接
78. 子集 - 力扣(LeetCode)
解题代码
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res = []n = len(nums)def helper(i,tmp):res.append(tmp)for j in range(i,n):helper(j + 1,tmp + [nums[j]])helper(0,[])return res
17.电话号码的字母组合
题目链接
17. 电话号码的字母组合 - 力扣(LeetCode)
解题思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:zlevelOrder = list()if not root:return zlevelOrderq = collections.deque([root])while q:level = collections.deque()for _ in range(len(q)):node = q.popleft()if len(zlevelOrder) % 2 == 0:level.append(node.val)else:level.appendleft(node.val)if node.left:q.append(node.left)if node.right:q.append(node.right)zlevelOrder.append(list(level))return zlevelOrder