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
相关推荐
九年义务漏网鲨鱼8 分钟前
【大模型面经】千问系列专题面经
人工智能·深度学习·算法·大模型·强化学习
源码之家1 小时前
机器学习:基于大数据二手房房价预测与分析系统 可视化 线性回归预测算法 Django框架 链家网站 二手房 计算机毕业设计✅
大数据·算法·机器学习·数据分析·spark·线性回归·推荐算法
Lv Jianwei1 小时前
Longest Palindromic Substring最长回文子串-学习动态规划Dynamic Programming(DP)
算法
WWZZ20251 小时前
快速上手大模型:深度学习7(实践:卷积层)
人工智能·深度学习·算法·机器人·大模型·卷积神经网络·具身智能
l1t2 小时前
用SQL求解advent of code 2024年23题
数据库·sql·算法
10岁的博客2 小时前
二维差分算法高效解靶场问题
java·服务器·算法
轻微的风格艾丝凡2 小时前
锂电池 SOC 估计技术综述:成熟算法、新颖突破与车企应用实践
算法·汽车
Codeking__2 小时前
动态规划算法经典问题——01背包问题
算法·动态规划
R-G-B2 小时前
归并排序 (BM20 数组中的逆序对)
数据结构·算法·排序算法
少许极端2 小时前
算法奇妙屋(十二)-优先级队列(堆)
数据结构·算法·leetcode·优先级队列··图解算法