LeetCode刷题之HOT100之岛屿数量

news2024/10/5 11:58:03

2024 6/27 酷暑难耐,天气热了,似乎更容易午睡了。上午上了cnn最后一节课。睡一觉买一杯蜜雪冰城,坐在舒适的实验室敲击键盘,做题!

1、题目描述

在这里插入图片描述

2、逻辑分析

是的,又是直奔题解的一天哈!题解给出三种求解方案:深度优先搜索、广度优先搜索以及并查集。我们只看DFS就可以啦。
算法思想主要是利用了深度优先搜索(DFS)来遍历二维网格,并找出所有的“岛屿”(由 ‘1’ 组成的连续区域)。算法的基本步骤如下:
初始化:
定义一个二维字符数组 grid,其中 ‘1’ 表示陆地(或岛屿的一部分),‘0’ 表示水域。
初始化一个计数器 num_islands0,用于记录岛屿的数量。
遍历网格:
使用两个嵌套的循环遍历整个网格 grid
在遍历过程中,如果当前位置是 ‘1’(即陆地),则表示找到了一个新的岛屿。
深度优先搜索(DFS):
当找到一个新的岛屿(即 ‘1’)时,调用 dfs 函数进行深度优先搜索。
dfs 函数会首先将当前位置的陆地标记为水域(即改为 ‘0’),以避免重复访问。
然后,它会递归地调用自身,搜索当前位置的上、下、左、右四个方向,继续寻找与该岛屿相连的其他陆地。
递归调用会持续进行,直到所有与该岛屿相连的陆地都被标记为水域。
计数:
在每次找到一个新的岛屿(即 ‘1’)时,将 num_islands 计数器加 1
由于 dfs 函数会确保一个岛屿的所有陆地都被标记为水域,因此同一个岛屿不会被重复计数。
返回结果:
遍历完整个网格后,返回 num_islands 的值,即岛屿的数量。

3、代码演示

// 深度优先搜索函数,用于标记和遍历一个岛屿的所有陆地  
    void dfs(char[][] grid, int i, int j){
        // 获取网格的行数和列数
        int nr = grid.length, nc = grid[0].length;
        // 如果当前位置超出网格边界或者已经是水域('0'),则直接返回 
        if(i < 0 || j < 0 || i >= nr || j >= nc || grid[i][j] == '0'){
            return ;
        }

        // 将当前位置的陆地标记为水域('0'),表示已经访问过 
        grid[i][j] = '0';
        // 递归地访问当前位置的上方、下方、左方和右方,继续深度优先搜索
        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j - 1);
        dfs(grid, i, j + 1);

    }

    // 主函数,用于计算岛屿的数量
    public int numIslands(char[][] grid) {
        // 如果网格为空或者没有行,则直接返回0
        if(grid == null || grid.length == 0){
            return 0;
        }

        // 获取网格的行数和列数
        int nr = grid.length, nc = grid[0].length;
        int num_islands = 0;
        // 遍历网格的每一个位置
        for(int i = 0; i < nr; i++){
            for(int j = 0; j < nc; j++){
                // 如果当前位置是陆地('1')
                if(grid[i][j] == '1'){
                    // 岛屿数量加1
                    num_islands++;
                    // 使用深度优先搜索遍历并标记当前岛屿的所有陆地 
                    dfs(grid, i, j);
                }

            }
        }
        // 返回岛屿数量
        return num_islands;
        
    }

4、复杂度分析

  • 时间复杂度:O(MN),其中 M 和 N 分别为行数和列数。
  • 空间复杂度:O(MN),在最坏情况下,整个网格均为陆地,深度优先搜索的深度达到 MN。

ok,做完啦,还有广度优先搜索和并查集就不做啦,看看就好!拜拜,又要去上课了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于MATLAB仿真设计无线充电系统

通过学习无线充电相关课程知识&#xff0c;通过课程设计无线充电系统&#xff0c;将所学习的WPT&#xff0c;DC-DC&#xff0c;APFC进行整合得到整个无线充电系统&#xff0c;通过进行仿真研究其系统特性&#xff0c;完成我们预期系统功能和指标。 以功率器件为基本元件&#x…

鸿蒙Harmony开发案例教程:如何进行蓝牙设备发现、配对、取消配对功能

如何进行蓝牙连接 场景说明 蓝牙技术是一种无线数据和语音通信开放的全球规范&#xff0c;它是基于低成本的近距离无线连接&#xff0c;为固定和移动设备建立通信环境的一种特殊的连接。本示例通过ohos.bluetoothManager接口实现蓝牙设备发现、配对、取消配对功能。 效果呈现…

《Nest系列 - 4. 听说人人都会CRUD,可是我还不会怎么办???-《4.3结合前端使用实现多表联合查询》

&#x1f351; 联合查询 在我们前端来说&#xff0c;会抽离一些公用组件。不会把重复的组件或者所有代码都放在一个文件夹下。对于后端来说&#xff0c;也是一样的&#xff0c; 我们不会把所有数据都放在一张表里&#xff0c;我们回进行分表&#xff0c;根据一些关联关系&…

为什么说展厅数字人是展览未来的趋势?

展厅数字人是利用数字化、智能化和网络化等信息技术手段提升展厅展览服务和游览体验的全新载体。随着人工智能和虚拟现实技术的应用发展&#xff0c;展厅数字人已成为展厅展览转型升级的重要趋势。 展厅数字人凭借其创新性、强可塑性&#xff0c;成为展厅新名片&#xff0c;为各…

数据库工具之 —— SQLite

数据库工具之 —— SQLite SQLite 是一个非常流行的轻量级数据库&#xff0c;它是一个嵌入式的数据库&#xff0c;意味着数据库文件是存储在磁盘上的一个单一文件。SQLite 不需要一个独立的服务器进程&#xff0c;这使得它非常适合用于小型应用、移动应用、桌面应用&#xff0…

阿里云centos7.9 挂载数据盘 并更改宝塔站点根目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…

Django REST framework安全实践:轻松实现认证、权限与限流功能

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff1…

ROT5、ROT13、ROT18、ROT47全系列加解密小程序

ROT5、ROT13、ROT18、ROT47全系列加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。自己编了一个关于ROT全系列的加、解密小程序。 ​ ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性&a…

use embeddings stored in vector db to reduce work for LLM generating response

题意&#xff1a;使用存储在向量数据库中的嵌入来表示&#xff0c;以减少大型语言模型&#xff08;LLM&#xff09;生成响应的工作量。 问题背景&#xff1a; Im trying to understand what the correct strategy is for storing and using embeddings in a vector database, …

计算机网路面试HTTP篇三

HTTPS RSA 握手解析 我前面讲&#xff0c;简单给大家介绍了的 HTTPS 握手过程&#xff0c;但是还不够细&#xff01; 只讲了比较基础的部分&#xff0c;所以这次我们再来深入一下 HTTPS&#xff0c;用实战抓包的方式&#xff0c;带大家再来窥探一次 HTTPS。 对于还不知道对称…

海报在线制作系统源码小程序

轻松设计&#xff0c;创意无限 一款基于ThinkPHPFastAdminUniApp开发的海报在线制作系统&#xff0c; 本系统不包含演示站中的素材模板资源。​ 一、引言&#xff1a;设计新纪元&#xff0c;在线海报制作引领潮流 在数字时代&#xff0c;海报已成为传播信息、展示创意的重要媒…

松下的台灯值得入手吗?书客、飞利浦热门品牌横评分享!

自从儿子步入小学&#xff0c;他埋首于书桌前的时光愈发冗长&#xff0c;很欣慰他能够认真专心学习&#xff0c;却也隐隐担忧他的视力健康。在了解视力健康中发现长时间在过暗或过亮的光线环境下学习&#xff0c;会导致瞳孔频繁地收缩与扩张&#xff0c;极易引发视觉疲劳。更令…

Isaac Sim 9 物理(1)

使用Python USD API 来实现 Physics 。 以下内容中&#xff0c;大部分 Python 代码可以在 Physics Python 演示脚本文件中找到&#xff0c;本文仅作为个人学习笔记。 一.设置 USD Stage 和物理场景 Setting up a USD Stage and a Physics Scene USD Stage不知道怎么翻译&#…

开放式耳机怎么选?2024全价位段机型推荐,真人实测不踩雷

作为一位深度测评耳机的专家&#xff0c;我深知对于音乐制作人员而言&#xff0c;优选一副适宜的耳机是至关重要的。我的一位朋友&#xff0c;身为音乐编辑&#xff0c;常常需长时间戴着耳机进行音频编辑与混音。他尝试了众多开放式耳机后&#xff0c;仍未找到完美契合的款式。…

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试&#xff0c;只为了学习istio&#xff0c;更好的理解istio中的控制面和数据面&#xff08;pilot -> proxy&#xff09;是如何交互的&#xff0c;下图的蓝色虚线 先说go-control-plane是什么…

安宝特方案 | AR术者培养:AR眼镜如何帮助医生从“看”到“做”?

每一种新药品的上市都需要通过大量的临床试验&#xff0c;而每一种新的手术工具在普及使用之前也需要经过反复的实践和验证。医疗器械公司都面临着这样的挑战&#xff1a;如何促使保守谨慎的医生从仅仅观察新工具在手术中的应用&#xff0c;转变为在实际手术中实操这项工具。安…

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中&#xff0c;管理个人或家庭的财务收支变得尤为重要。然而&#xff0c;传统的记账方式往往繁琐且复杂&#xff0c;让人望而却步。今天&#xff0c;我们为您推荐一款简洁易用的记账神器——晨曦记账本&#xff0c;让您轻松记录收支&#xff0c;只显示日期&#xf…

三种三相交流电动机正反转互锁电路的分析

PLC和固态继电器应用都很普及了&#xff0c;常规电磁继电器还有用武之地吗?答案是&#xff1a;有用武之地的。因为微处理器的应用使逻辑控制发生了变革&#xff0c;极大地发挥了开关功能的特性&#xff0c;但在应用中&#xff0c;它还是无法承受较大的负载&#xff0c;因此还要…

PyTorch的环境配置和安装

PyTorch环境配置及安装 初步机器学习&#xff0c;这里记录下一些学习经过&#xff0c;之后以便于自己查看&#xff0c;同时欢迎各位大佬点评&#xff0c;本节是机器计算的一个包的安装和简单验证。 安装、使用环境 Windows环境下&#xff1a;CUDA官网使用IDM下载就很快乐&am…

3 滑动窗口

滑动窗口是一种常用的数据结构和算法思想&#xff0c;广泛应用于处理数组或序列中的连续片段问题。它的核心特点是窗口的大小可以动态调整&#xff0c;但总保持一个固定大小&#xff0c;通过在序列上“滑动”来检查不同的子序列。以下是滑动窗口的一些典型应用场景&#xff1a;…