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
相关推荐
多弗朗皮卡丘6 分钟前
C++ 哈希(下)
c++·算法·哈希算法
aichitang202420 分钟前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
Coder-magician1 小时前
图论总结篇
算法·图论
有同事要进步1 小时前
Leecode第68题:x的平方根
java·数据结构·算法
吹什么轩1 小时前
linux系统复习:进程优先级与O(1)调度
java·linux·算法
开开心心就好1 小时前
安卓PDF处理工具,免费无广告零弹窗
android·服务器·开发语言·算法·pdf·ocr
zyl76517 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖21 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌21 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F21 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人