leetcode:DFS&BFS的模板编程

这一次总结一下 BFS 的几个主要步骤

肯定会用到 deque 的结构用来模拟队列,BFS精髓也在这里。

  1. 队列里肯定是有一个初始点
  2. 然后每次处理从队列中出队一个元素
  3. 对元素进行扩张(具体如何扩张需要根据题目要求,一般是上下左右四个方向,本题是算上斜向共8个方向)
  4. 对于扩张后满足某条件的点再进行处理,根据需要进入队列,进入队列的点就是扩到下一层的点(不同题目需要处理的方法不同,大家灵活运用)
  5. 然后接着循环处理 deque 中的元素,直到 deque 为空,则代表所有点都已经完成扩张
  6. 最后根据题目要求输出结果(当然这已经不属于 BFS 模板的范围了)
queue=collections.deque([])
queue.append(第一个满足条件的点)

while queue 不空:
    cur = queue.popleft()
    标记我们访问过cur这个点,从而之后不会再访问到这个点
    for 节点 in cur的所有相邻节点:
        if 该节点有效且满足条件:
            queue.append(该节点)
            标记我们访问过这个节点

回溯算法框架

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择
全排列
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        path = []
        n = len(nums)
        used = [False] * n

        def dfs(path ,used):
            if len(path) == n:
                res.append(path.copy())
                return
            for i in range(n):
                if used[i]: continue
                used[i] = True
                
                path.append(nums[i])
                
                dfs(path,used)
                path.pop()
                used[i] = False
        
        dfs(path,used)
        return res
             

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值