DFS专题:力扣岛屿问题(持续更新)

    DFS专题:力扣岛屿问题

一、岛屿数量

题目链接: 200.岛屿数量

题目描述

在这里插入图片描述

代码思路

使用for对每一个网格点进行判断,如果遇到未搜索过的’1’,则使岛屿数加一,并利用dfs将与其相连的‘1’都进行标记,确保每次搜索到1都是一个新的岛屿。

代码纯享版

class Solution {
    public int numIslands(char[][] grid) {
        int len = grid.length; 
        int wide = grid[0].length; 
        int sum = 0;
        for(int i = 0; i < len; i++){
            for(int j = 0; j < wide; j++){
                if(grid[i][j] == '1'){
                    sum++;
                    dfs(grid, i, j);
                }
            }
        }

        return sum;
    }
    void dfs(char[][] grid, int i, int j){
        int len = grid.length;
        int wide = grid[0].length;
        if(i < 0 || i >= len || j < 0 || j >= wide || grid[i][j] != '1'){
            return;
        }
        grid[i][j] = '2'; 
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j - 1);
        dfs(grid, i, j + 1);
    }
}

代码逐行解析版

class Solution {
    
    public int numIslands(char[][] grid) {
        int len = grid.length; //岛屿长度
        int wide = grid[0].length; //岛屿宽度
        int sum = 0; //岛屿总数

        //遍历岛屿每一个位置
        for(int i = 0; i < len; i++){
            for(int j = 0; j < wide; j++){ 
                if(grid[i][j] == '1'){ //如果为陆地
                    sum++; //岛屿总数加一
                    dfs(grid, i, j); //dfs
                }
            }
        }

        return sum;
    }

    //深度搜索所有连接在一起的'1',将其变为'2'
    //grid[i][j] == '0' 水
    //grid[i][j] == '1' 未搜索的陆地
    //grid[i][j] == '2' 已搜索的陆地
    void dfs(char[][] grid, int i, int j){
        int len = grid.length;
        int wide = grid[0].length;

        //排除2种情况
        //1.超出网格范围的搜索
        //2.不是未搜索的陆地
        if(i < 0 || i >= len || j < 0 || j >= wide || grid[i][j] != '1'){ 
            return;
        }
        grid[i][j] = '2'; //将grid[i][j] == '1'的情况标记为'2'
        //上下左右四个方位的搜索
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j - 1);
        dfs(grid, i, j + 1);
    }
}

二、岛屿的周长

题目链接: 463.岛屿的周长

题目描述

在这里插入图片描述

代码思路

利用for循环遍历到一块陆地后,对这块陆地进行dfs搜索,遇到海洋或超出区域的部分,则周长加一;遇到未搜索过的陆地,则标记为搜索过;遇到搜索过的陆地,直接返回。

代码纯享版

class Solution {

    public int area = 0;

    public int islandPerimeter(int[][] grid) {
        int len = grid.length;
        int wide = grid[0].length;
        

        int i = 0, j = 0;
        int judge = 1;
        for(i = 0; i < len; i++){
            for(j = 0; j < wide; j++){
                if(grid[i][j] == 1){
                    dfs(grid, i , j);
                    return area;
                }
            }
            
        }
        
        return 0;
    }

    void dfs(int[][] grid, int i, int j){
        int len = grid.length;
        int wide = grid[0].length;

        if(i < 0 || i >= len || j < 0 || j >= wide || grid[i][j] == 0){
            area++;
            return;
        }
        if(grid[i][j] == 2){
            return;
        }
        
        grid[i][j] = 2;
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j + 1);
        dfs(grid, i, j - 1);
    }
}

代码逐行解析版

class Solution {

    public int area = 0; //设周长为公共变量

    public int islandPerimeter(int[][] grid) {
        int len = grid.length; 
        int wide = grid[0].length;
        
        for(int i = 0; i < len; i++){
            for(int j = 0; j < wide; j++){
                if(grid[i][j] == 1){ //碰到陆地,进行dfs
                    dfs(grid, i , j); 
                    return area; //只有一块岛屿,所以搜索一次后即可返回周长
                }
            }
            
        }
        
        return 0; //没找到岛屿,返回0
    }

    void dfs(int[][] grid, int i, int j){
        int len = grid.length;
        int wide = grid[0].length;

        //由题目图可知,搜索到超出区域范围或海洋位置的,周长加一
        if(i < 0 || i >= len || j < 0 || j >= wide || grid[i][j] == 0){ 
            area++;
            return;
        }
        if(grid[i][j] == 2){ //已搜索过的直接返回
            return;
        }
        
        grid[i][j] = 2; //把未搜索过的陆地标记为2:已搜索过的陆地

        //对上下左右进行搜索
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j + 1);
        dfs(grid, i, j - 1);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

数据库查询:查询入参类型和数据库字段类型不匹配导致的问题

问题&#xff1a;假设我们现在有这样的一张表 CREATE TABLE test_person (id int(20) NOT NULL COMMENT 主键,name varchar(20) DEFAULT NULL COMMENT 姓名,gender char(2) DEFAULT NULL COMMENT 性别,birthday date DEFAULT NULL COMMENT 生日,created_time timestamp NULL D…

【电控笔记8】前馈技术

2.4前馈 前馈可以减轻控制器的负担

安宝特方案 | AR工业解决方案系列-工厂督查

在工业4.0时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正全面重塑传统工业生产&#xff0c;在工厂监督领域&#xff0c;其应用不仅大幅提升了生产效率、监测准确性和规范执行程度&#xff0c;而且为整体生产力带来了质的飞跃。 01 传统挑战与痛点 在制造业生产流程…

【前端面试3+1】17 伪类和伪元素的区别、CSS权重、图片显示优化、【二叉树最大深度】

一、伪类和伪元素的区别 1、伪类&#xff1a; 伪类是用来描述元素的特定状态的选择器&#xff0c;比如:hover、:active、:first-child等。伪类在选择器中以冒号&#xff08;:&#xff09;开头&#xff0c;用于匹配处于特定状态的元素。伪类可以用于选择DOM元素的特定状态&#…

ARM看门狗定时器

作用 在S3C2440A中&#xff0c;看门狗定时器的作用是当由于噪声和系统错误引起的故障干扰时恢复控制器的工作。 也就是说&#xff0c;系统内部的看门狗定时器需要在指定时间内向一个特殊的寄存器内写入一个数值&#xff0c;俗称喂狗。 如果喂狗的时间过了&#xff0c;那么看门…

基于springboot+vue实现的疫情防控物资调配与管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

探索顶级短视频素材库:多样化选择助力创作

在数字创作的浪潮中&#xff0c;寻找优质的短视频素材库是每位视频制作者的必经之路。多种短视频素材库有哪些&#xff1f;这里为您介绍一系列精选的素材库&#xff0c;它们不仅丰富多样&#xff0c;而且高质量&#xff0c;能极大地提升您的视频创作效率和质量。 1.蛙学网 蛙学…

git操作基本命令

Git命令操作&#xff1a; 1、服务器上面有新的修改&#xff0c;pull出现错误操作如下 git stash git pull origin master git stash pop 2、删除本地一个文件test.py,想重新download远程服务器最新的文件 #git checkout test.py 3、查看当前处于哪一个分支 #git …

stm32开发之threadx整合letter-shell 组件记录

前言 使用过rt-thread的shell 命令交互的方式&#xff0c;觉得比较方便,所以在threadx中也移植个shell的组件。这里使用的是letter-shellletter-shell 核心的逻辑在于组件通过链接文件自动初始化或自动添加的两种方式&#xff0c;方便开发源码仓库 实验(核心代码) shell 线程…

ECMA进阶1之从0~1搭建react同构体系项目1

ECMA进阶 ES6项目实战前期介绍SSRpnpm 包管理工具package.json 项目搭建初始化配置引入encode-fe-lint 基础环境的配置修改package.jsonbabel相关tsconfig相关postcss相关补充scripts脚本webpack配置base.config.tsclient.config.tsserver.config.ts src环境server端&#xff1…

链表--经典题

题目一&#xff1a;移除链表元素 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;head [7,7,7,7], val 7 输出…

【转】关于vsCode创建后,不显示NPM脚本解决

刚刚使用vue ui新建了个vue项目&#xff0c;打开vs-code发现&#xff0c;无论怎么设置都找不到NPM脚本显示&#xff0c;苦恼了很久&#xff0c;突然发现&#xff01;打开了package-lock.json&#xff0c;然后立马把vs-code关闭&#xff0c;重新打开&#xff0c;就显示了npm脚本…

计算机网络(三)数据链路层

数据链路层 基本概念 数据链路层功能&#xff1a; 在物理层提供服务的基础上向网络层提供服务&#xff0c;主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改在为逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的…

03-echarts如何画立体柱状图

echarts如何画立体柱状图 一、创建盒子1、创建盒子2、初始化盒子&#xff08;先绘制一个基本的二维柱状图的样式&#xff09;1、创建一个初始化图表的方法2、在mounted中调用这个方法3、在方法中写options和绘制图形 二、画图前知识1、坐标2、柱状图图解分析 三、构建方法1、创…

构建高效协同平台架构:实现团队协作的新高度

随着企业规模的扩大和工作方式的变革&#xff0c;团队协作变得愈发重要。在这个数字化时代&#xff0c;构建一个高效的协同平台架构&#xff0c;能够为团队提供强大的工具和资源&#xff0c;实现更加高效、灵活的协作方式。本文将探讨协同平台架构的重要性&#xff0c;并介绍如…

UE5不打包启用像素流 ubuntu22.04

首先查找引擎中像素流的位置&#xff1a; zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码&#xff1a; ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…

笔试的解题思路很多,

昨天发的笔试题目&#xff0c;留言的人还挺多&#xff0c;这道笔试题目是字节的嵌入式笔试题目&#xff0c;从面试的朋友描述说&#xff0c;对方的面试过程很专业。 现场写代码&#xff0c; 金三银四一直是铁律&#xff0c;去年我一个朋友离职后&#xff0c;也是最近这几天拿到…

【C语言】预处理

个人主页点这里~ 预处理 一、预处理符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏与函数的对比&#xff08;一&#xff09;、宏的优势&#xff08;二&#xff09;、宏的劣势&#xff08;三&#xff09;、宏和函数的对比 七、#和##1、…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…