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
相关推荐
dog shit22 分钟前
蓝桥杯第十一届省赛C++B组真题解析
算法
Swift社区40 分钟前
LeetCode 252 会议室题全解析:Swift 实现 + 场景还原
算法·leetcode·swift
要下雨了吗41 分钟前
指针数组 vs 数组指针
c语言·数据结构·c++·算法·visual studio
emmmmXxxy1 小时前
leetcode刷题-单调栈
算法·leetcode·职场和发展
MiyamiKK571 小时前
leetcode_数组 189. 轮转数组
python·算法·leetcode·职场和发展
武装头脑ing1 小时前
递增子序列
数据结构·算法
QQ_7781329741 小时前
模运算:数字世界中的时空扭曲法则——从密码学到量子计算的跨维演绎
算法
qq_433554541 小时前
C++ 蓝桥云课代码练习
c++·算法·图论
森焱森2 小时前
单片机FreeRTOSTickless低功耗模式应用示例
c语言·网络·单片机·算法·架构
sml259(劳改版)2 小时前
(PTA) L2-011-L2-015
数据结构·算法