top100-回溯算法专题

回溯算法和深度优先遍历

回溯法采用试错的思想,它尝试分布的去解决一个问题。在分布解决问题的过程中,当它通过尝试发现现有的分布答案不能得到有效的正确的解答的时候,它将取消上一步甚至上级不的计算,再通过其他的可能的分布解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:

  • 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))
                return
            for 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 zlevelOrder
        
        q = 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
相关推荐
苏小瀚5 小时前
算法---位运算
java·算法
Code小翊5 小时前
归并排序基础理解
数据结构·算法·排序算法
2401_841495646 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
珊珊而川6 小时前
SAUP 算法
算法
寂静山林6 小时前
UVa 1471 Defense Lines
算法
CHANG_THE_WORLD7 小时前
switch语句在汇编层面的几种优化方式 ,为什么能进行优化
汇编·算法·switch·汇编分析·switch case·switch case 汇编·switch case 语句
山,离天三尺三7 小时前
深度拷贝详解
开发语言·c++·算法
Blossom.1187 小时前
把AI“撒”进农田:基于极值量化与状态机的1KB边缘灌溉决策树
人工智能·python·深度学习·算法·目标检测·决策树·机器学习
一只鱼^_7 小时前
第 167 场双周赛 / 第 471 场周赛
数据结构·b树·算法·leetcode·深度优先·近邻算法·迭代加深
被制作时长两年半的个人练习生7 小时前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子