当前位置: 首页 > news >正文

搜索算法------深度优先搜索

1. 介绍

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法通过尽可能深地搜索图的分支来探索解决方案空间,直到达到一个没有分支的点,然后回溯

1.1 原理

  1. 选择起始点:从图中的某个顶点开始
  2. 探索分支:沿着一条路径尽可能深地探索,直到到达一个没有未探索邻接点的顶点
  3. 回溯:当无法进一步深入时,回溯到上一个顶点,探索其他未探索的分支
  4. 重复:重复上述过程,直到所有顶点都被访问过

比如下图是一颗简单的树:
在这里插入图片描述
首先我们从1开始,沿着最左边的路径探索,于是首先找到了2这个节点,然后再深入,找到了3,3后面没有节点了,于是回溯到2,再向右找到了4,4后面没有节点,再回溯到2,2的节点都已探索结束,于是返回1,由1开始继续向右探索,找到了6,然后从6开始找到了7,7后面没有节点,回溯到6,6后面也没有节点,回溯到1,1也没有其他节点,于是探索结束。所以这颗树的深度优先搜索结果就为123467.

2. 题目

在这里插入图片描述

3. 思路和题解

这道题其实就可以用DFS来求解,当我们对这个二维数组进行遍历时,对于每一块土地,就是通过上面所描述的原理,去尽可能深的寻找前后左右有土地的地方,如果没有土地了,则进行回溯,以此类推,直到寻找结束。
当我们在寻找的时候,如果这块土地已经找过了,为了避免重复计算,我们将其置为0,然后最后取所有岛屿的最大值即可。
代码如下:

class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int nr = grid.length;
        int nc = grid[0].length;
        int ans = 0 ;
        for(int r = 0; r < nr;r++){
            for(int c = 0;c < nc;c++){
                if(grid[r][c] == 1){
                    ans = Math.max(ans,dfs(grid,r,c));
                }
            }
        }
        return ans;
    }
    public int dfs(int[][] grid,int r,int c){
        int nr = grid.length;
        int nc = grid[0].length;
        int ans = 0;
        if(r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == 0){
            return 0;
        }
        grid[r][c] = 0;
        ans++;
        ans = ans +dfs(grid,r-1,c);
        ans = ans +dfs(grid,r+1,c);
        ans = ans +dfs(grid,r,c-1);
        ans = ans +dfs(grid,r,c+1);
        return ans;
    }
}
http://www.dtcms.com/a/102346.html

相关文章:

  • 解锁AI潜能:模型上下文协议(MCP)的革新与应用
  • 原生应用与Web应用的融合演进:现代跨平台开发指南
  • 常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析
  • 2025年江苏公路水运安全员ABC证精选考试题库
  • 【Android Studio】下载安装过程(详细)
  • LangChain4j(2):整合SpringBoot
  • MCP服务:五分钟实现微服务治理革命,无缝整合Nacos/Zookeeper/OpenResty
  • 【QT5 网络编程示例】TCP 通信
  • Spring Boot启动流程
  • 力扣每日一题:2712——使所有字符相等的最小成本
  • 车载以太网网络测试-26【SOME/IP-通信方式-2】
  • 【力扣hot100题】(026)合并两个有序链表
  • [RoarCTF 2019]Easy Java1
  • 排序算法可视化工具——基于React的交互式应用
  • openEuler 24.03 (LTS) 安装 docker 记录
  • Go语言从零构建SQL数据库引擎(3)
  • rustdesk 客户端使用
  • 算法篇-------------双指针法
  • Matplotlib绘制常用图像
  • 各种网址整理-vue,前端,linux,ai前端开发,各种开发能用到的网址和一些有用的博客
  • javaweb自用笔记:文件上传案例、登录(统一拦截)案例
  • SpringCould微服务架构之Docker(9)
  • 便捷解析下载热门短视频、图片的安卓免费软件
  • 代码随想录C++算法训练,二叉树(day16)
  • vcpkg安装及使用教程,以安装matio库解析mat文件为例
  • 部署Dify接入微信验证反代根目录创建一个文件通过微信小程序验证
  • 机器学习入门指南:从零开始理解AI的核心
  • 高效屏幕录制软件,涵盖多样功能满足多元需求
  • k8s node cpu打满会导致容器发生什么?
  • 蓝桥杯比赛 python程序设计——奇怪的捐赠