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
相关推荐
NAGNIP14 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队15 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja19 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下19 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶20 小时前
算法 --- 字符串
算法
博笙困了20 小时前
AcWing学习——差分
c++·算法
NAGNIP20 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP20 小时前
大模型微调框架之LLaMA Factory
算法
echoarts20 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客20 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法