【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)

简介: 【算法模板】DFS秒杀模板—附练习题(阳光号启航)(二)

树类型模板

我们在写一些树的算法题的时候其实最常用的就是DFS。因为我们需要使用一直递归直到找到树的叶子节点,才能直到这棵树的深度且有办法继续去写。那么说到这里我们就来一道求深度的算法题吧!


题目:剑指 Offer 55 - I. 二叉树的深度


输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。


例如:


给定二叉树 [3,9,20,null,null,15,7],


3

/

9 20

/

15 7

返回它的最大深度 3 。


从本题我们能大概的直到本题的目的就是求一颗二叉树的最大深度。


思路:求最大深度,我们可以使用递归,找到左右子树到叶子节点的深度并且取最大值。


image.png


我们可以看上图左子树的最大深度是1,而右子树的最大深度是2。则我们取深度的最大值并加上1(根节点本身也算1个深度)就是我们所需要得到的结果了。(图做的有点抽象,大家别建议5555)。


Java版本:


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        //判断一个根节点是是否为空,如果为空则返回0。
        if(root == null){
            return 0;
        }
        //进行一个递归判断左子树和右子树的最大值并加上一。
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}



Python版本:


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#思路是和Java版本的一样的。
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1


因为树的很多大部分都是递归写法,和这个相差不太大,所以我就只给上面一个例题。接下来就是给大家附练习题了。




表格遍历模板

本模板和BFS其实有一些地方是相同的:最常见的就是上下左右四个方向的判断。


那我们还是拿最经典的岛屿问题来讲解这个问题。


题目:200. 岛屿数量

题目:


给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。


岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。


此外,你可以假设该网格的四条边均被水包围。


示例 1:


输入:grid = [

[“1”,“1”,“1”,“1”,“0”],

[“1”,“1”,“0”,“1”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“0”,“0”,“0”]

]

输出:1

示例 2:


输入:grid = [

[“1”,“1”,“0”,“0”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“1”,“0”,“0”],

[“0”,“0”,“0”,“1”,“1”]

]

输出:3

image.png




其实本题使用DFS也是使用沉岛的思想,使用循环逐一遍历这个grid如果为1就res结果集就加一,且使用DFS沉岛。


具体的流程我们可以看代码来逐步分析。


Java版本:


class Solution {
    //设置返回结果集
    int res = 0;
    public int numIslands(char[][] grid) {
        //获取grid的长和宽。
        int m = grid.length;
        int n = grid[0].length;
        //for循环遍历整个grid表格。
        for (int i = 0 ; i < m ; i++ ){
            for (int j = 0 ; j < n ;j ++ ){
                //发现陆地‘1’的时候res加一,且是用dfs沉岛。
                if (grid[i][j] == '1'){
                    res += 1;
                    dfs(i,j,m,n,grid);
                }
            }
        }
        //返回最后结果
        return res;
    }
    //定义dfs方法,用来沉岛
    void dfs(int x , int y,int m , int n , char[][] grid) {
        //判断如果越界和不是陆地则结束递归。
        if (x < 0 || y < 0 || x >= m || y >= n || grid[x][y]== '0') return ;
        //如果grid[x][y] == '1',则把它变为'0'且继续使用DFS遍历x,y四周的岛屿。
        grid[x][y] = '0';
        dfs(x - 1,y,m,n,grid);
        dfs(x + 1,y,m,n,grid);
        dfs(x , y + 1,m,n,grid);
        dfs(x , y - 1,m,n,grid);
    }
}


Python版本:


class Solution:
    #Python的大体思路是和上面Java的一样,这里我就不再过多的叙述了。
    def numIslands(self, grid: List[List[str]]) -> int:
        x = len(grid)
        y = len(grid[0])
        def dfs (grid,i,j):
            if i < 0 or j < 0 or i >=  x or j >= y or grid[i][j] =='0':
                return 
            grid[i][j] = '0'
            dfs (grid,i-1,j)
            dfs (grid,i+1,j)
            dfs (grid,i,j-1)
            dfs (grid,i,j+1)
        num = 0
        for i in range(x):
            for j in range(y):
                if grid[i][j] == '1':
                    dfs(grid,i,j)
                    num += 1
        return num



因为岛屿这种表格题也是非常简单的,无论是使用DFS还是BFS。我们都可以套用模板来解决这种类型的问题,但是为了能更好的提高自己的算法能能力,博主还是建议大家能够去多多练习的,同时下面也整理了一些习题为大家加餐。


总结

本文也是到了尾声,同时非常感谢能看到这里的小伙伴们,也更希望本文能对你们有所帮助。这个系列—算法模板如果没有什么意外博主是会一直更新下去的,更希望能帮助一下初学的小伙伴们。


每一篇文章都是博主十分用心创作出来的,如果能给大家带来帮助希望大家来个一键三连。这将会是博主最大的动力哦!!!


目录
相关文章
|
9天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2331 12
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
9天前
|
云安全 人工智能 安全
|
9天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
1049 2
|
9天前
|
人工智能 自然语言处理 数据挖掘
最新版通义千问(Qwen3.8-Max-Preview)功能介绍
2026年,通义千问正式推出全新旗舰级大模型 **Qwen3.8-Max-Preview 预览版**,作为首款突破万亿参数规格的新一代基座模型,该模型总参数量达到**2.4万亿**,采用全新迭代的MoE混合专家架构,综合推理性能、长文本处理、多模态理解、复杂任务规划能力全面超越前代Qwen3.7-Max版本,整体实力跻身全球第一梯队,可对标海外顶级旗舰模型,是当前面向复杂工程开发、多智能体协同、超长文档解析、专业办公自动化场景的最优国产基座模型。
1087 0
|
11天前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
1048 44
|
7天前
|
自然语言处理 测试技术 API
通义千问Qwen3.8-Max-Preview全功能解析:2.4万亿参数旗舰模型深度使用指南
在大模型技术持续迭代的当下,通义千问推出的Qwen3.8-Max-Preview作为新一代旗舰预览版模型,凭借2.4万亿参数的超大规模、多模态融合能力与全场景适配特性,成为开发者与企业用户探索AI应用的核心工具。该模型采用稀疏混合专家(MoE)架构,是通义千问首个突破万亿参数的多模态模型,可同时处理文本、图像、视频与文档等多种数据形态,在全栈代码开发、复杂逻辑推理、长文档分析与多智能体协作等场景实现跨越式升级。本文将全面拆解Qwen3.8-Max-Preview的核心功能,详解API调用流程与配置方法,覆盖多场景实战技巧,帮助用户快速掌握这款旗舰模型的使用方法,充分释放其性能潜力。
521 1
|
7天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
621 0
|
10天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max 预览版全解析:2.4 万亿参数旗舰模型,Token Plan 限时优惠指南
Qwen3.8-Max-Preview是通义千问Qwen3系列旗舰MoE大模型,参数达2.4万亿,综合推理能力居行业第一梯队。支持思考/快速双模式,擅长大模型五大高难场景。现于阿里云百炼Token Plan、Qoder及QoderWork上线体验,个人版低至39元/月。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
714 1
Qwen3.8-Max 预览版全解析:2.4 万亿参数旗舰模型,Token Plan 限时优惠指南