当前位置: 首页 > 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;
    }
}

相关文章:

  • 解锁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前端开发,各种开发能用到的网址和一些有用的博客
  • 网上推广是什么意思/seo外包费用
  • 专业做网站优化价格/事件营销
  • 阿里云Windows网站建设/怎么开发一个网站
  • 淄博做网站建设公司/推广目标怎么写
  • 深圳网站建设开发需要多少钱/微信软文范例
  • 天津市工程建设公众信息网官网/武汉seo网站推广培训