力扣hot---岛屿数量

dfs思路:

首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的点的同时,将这些元素标记为2,即代表这篇区域已经遍历过),那么遍历下一个点。遇到一个新的区域则cnt++。

那么怎么进行深度搜索呢?即如果该点=1,那么将该点的上方、下方、左方、右方送入dfs。

dfs代码:

C++:

class Solution {
public:
    int p_m[4]={-1,1,0,0};
    int p_n[4]={0,0,-1,1};
    void dfs(vector<vector<char>>& grid,int i,int j,int m,int n){
        for(int k=0;k<4;k++){
            int x=i+p_m[k];
            int y=j+p_n[k];
            if(x>=0 && x<m && y>=0 && y<n){
                if(grid[x][y]=='0'||grid[x][y]=='2'){
                    continue;
                }
                else{
                    grid[x][y]='2';
                    dfs(grid,x,y,m,n);
                }
            }
        }

    }
    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        //cout<<m<<' '<<n<<endl;
        int cnt=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='2'||grid[i][j]=='0'){continue;}
                else{
                    dfs(grid,i,j,m,n);
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

注意:二维数组中,求行数为 

int m=grid.size();

求列数为

int n=grid[0].size();

python:

class Solution:

    def dfs(self,grid:List[list[str]],i:int,j:int,m:int,n:int) -> int:
        p_m=[-1,1,0,0]
        p_n=[0,0,-1,1]
        for k in range(4):
            x=i+p_m[k]
            y=j+p_n[k]
            if x>=0 and x<m and y>=0 and y<n:
                if grid[x][y]=='0' or grid[x][y]=='2':
                    continue
                else:
                    grid[x][y]='2'
                    self.dfs(grid,x,y,m,n)

    def numIslands(self, grid: List[List[str]]) -> int:
        m=len(grid)
        n=len(grid[0])
        cnt=0
        for i in range(m):
            for j in range(n):
                if grid[i][j]=='2' or grid[i][j]=='0':
                    continue;
                else:
                    self.dfs(grid,i,j,m,n)
                    cnt+=1
        return cnt

bfs思路:

与dfs类似,遍历每个元素时,如果该元素的值为1,那么将其入队列,并且考虑其上下左右的元素,如果周围元素值为1,将其也入队列。遍历一个元素时,如果该值为1,那么代表访问了一个新的区域,则cnt++。

代码:

C++:

class Solution {
public:
    deque<pair<int,int>> q;
    int p_x[4]={-1,1,0,0};
    int p_y[4]={0,0,1,-1};
    int numIslands(vector<vector<char>>& grid) {
        int cnt=0;
        int m=grid.size();
        int n=grid[0].size();
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='0'||grid[i][j]=='2'){continue;}
                else{cnt++;}
                q.push_back({i,j});
                while(!q.empty()){
                    pair<int,int> temp=q.front();
                    q.pop_front();
                    int temp_x=temp.first;
                    int temp_y=temp.second;
                    if(grid[temp_x][temp_y]=='0'||grid[temp_x][temp_y]=='2'){continue;}
                    else{
                        grid[temp_x][temp_y]='2';
                        for(int k=0;k<4;k++){
                            int x=temp_x+p_x[k];
                            int y=temp_y+p_y[k];
                            if(x>=0 && x<m && y>=0 && y<n){
                                if(grid[x][y]=='0'||grid[x][y]=='2'){continue;}
                                else{
                                    q.push_back({x,y});
                                }
                            }
                        }
                    }
                }
            }
        }
        return cnt;
    }
};

明显可以看到bfs要比dfs慢的多。

 python:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        q=deque()
        p_x=[-1,1,0,0]
        p_y=[0,0,1,-1]
        cnt=0
        m=len(grid)
        n=len(grid[0])
        for i in range(m):
            for j in range(n):
                if grid[i][j]=='0' or grid[i][j]=='2':
                    continue
                else:
                    cnt+=1
                q.append((i,j))
                while q:
                    temp=q[0]
                    q.popleft()
                    temp_x=temp[0]
                    temp_y=temp[1]
                    if grid[temp_x][temp_y]=='0' or grid[temp_x][temp_y]=='2':
                        continue
                    else:
                        grid[temp_x][temp_y]='2'
                        for k in range(4):
                            x=temp_x+p_x[k]
                            y=temp_y+p_y[k]
                            if x>=0 and x<m and y>=0 and y<n:
                                if grid[x][y]=='0' or grid[x][y]=='2':
                                    continue
                                else:
                                    q.append((x,y))
        return cnt

注意:C++中的pair<int,int>用python中的tuple来代替

q.append((i,j))

同时,记得添加from collections import deque 

并查集思路:

遍历所有元素,如果该元素为‘0’,则跳过;如果该元素为‘1’,cnt++(岛屿数++,后面再依次向下减),同时为其分配一个Father结点,值为其本身,但是本身是(i,j),该怎么存到Father数组中呢?用二维数组转换成一维数组的方法,即将(i,j)转换为(i*n+j)【相当于以行优先,看是第几个元素】。接下来,依次判断上下左右值,如果为1,就和自己合并。这里分为真合并和假合并,假合并就是这两个值原来就合并过。如果是真合并,则进行cnt--的操作。

并查集代码:

C++:

class Solution {
public:
    int p_x[4]={-1,1,0,0};
    int p_y[4]={0,0,-1,1};
    int cnt=0;

    int find(vector<int>& Father,int x){
        if(Father[x]==x){return x;}
        Father[x]=find(Father,Father[x]);
        return Father[x];
    }

    void Union(vector<int>& Father,int x,int y){
        int Fx=find(Father,x);
        int Fy=find(Father,y);
        if(Fx==Fy){return;}
        Father[Fy]=Fx;
        cnt--;
    }

    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        vector<int> Father(m*n,0);
        //初始化Father数组
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int temp=n*i+j;
                if(grid[i][j]=='1'){
                    Father[temp]=temp;
                    cnt++;
                }
                else{Father[temp]=-1;}
            }
        }
        //Union
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='0'){continue;}
                for(int k=0;k<4;k++){
                    int x=i+p_x[k];
                    int y=j+p_y[k];
                    if(x>=0 && x<m && y>=0 && y<n){
                        if(grid[x][y]=='0'){continue;}
                        else{
                            int a=i*n+j;
                            int b=x*n+y;
                            Union(Father,a,b);
                        }
                    }
                }
            }
        }
        return cnt;
    }
};

Python:

 

class Solution:
    def find(self,Father:List[int],x:int) -> int:
        if Father[x]==x:
            return x
        Father[x]=self.find(Father,Father[x])
        return Father[x]
    
    def Union(self,Father:List[int],x:int,y:int,cnt:int) ->int:
        Fx=self.find(Father,x)
        Fy=self.find(Father,y)
        if Fx==Fy:
            return cnt
        Father[Fy]=Fx
        cnt-=1
        return cnt

    def numIslands(self, grid: List[List[str]]) -> int:
        p_x=[-1,1,0,0]
        p_y=[0,0,-1,1]
        m=len(grid)
        n=len(grid[0])
        Father=[0]*(m*n)
        cnt=0

        for i in range(m):
            for j in range(n):
                temp=n*i+j
                if grid[i][j]=='1':
                    Father[temp]=temp
                    cnt+=1
                else:
                    Father[temp]=-1

        for i in range(m):
            for j in range(n):
                if grid[i][j]=='0':
                    continue
                for k in range(4):
                    x=i+p_x[k]
                    y=j+p_y[k]
                    if x>=0 and x<m and y>=0 and y<n:
                        if grid[x][y]=='0':
                            continue
                        else:
                            a=i*n+j
                            b=x*n+y
                            cnt=self.Union(Father,a,b,cnt)

        return cnt
    

注意类中函数第一个参数为self 

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

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

相关文章

打字通小游戏制作教程:用HTML5和JavaScript提升打字速度

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

strlen和sizeof的应用与区别

sizeof和strlen作为都能求大小的工具两者之间有何不同, strlen: 1. strlrn计算的是什么的大小 strlen计算的是字符串长度的大小&#xff0c;所以strlen在计算字符串长度时会一直顺着字符串的元素一个一个的查找&#xff0c;一直到查询到了/0才会停止 2.strlen属于库函数&am…

C# 用 System.Xml 读 Freeplane.mm文件,生成测试用例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 先写一个测试程序 test_read_Xml.cs 如下 using System;…

基于springboot+vue实现开放实验室管理系统项目【项目源码+论文说明】

基于springbootvue实现企业任务管理追踪系统演示 摘要 信息技术永远是改变生活的第一种创新方式&#xff0c;各种行业的发展更是脱离不了科技化的支持。原本传统的行业正在被科技行业的切入悄悄的发生变化。就拿我们生活当中常见的事情举例而言&#xff0c;在外卖行业还没有发…

Linux/Windows下部署OpenCV环境(Java/SpringBoot/IDEA)

环境 本文基于Linux&#xff08;CentOS 7&#xff09;、SpringBoot部署运行OpenCV 4.5.5&#xff0c;并顺带记录Windows/IDEA下如何调试SpringBoot调用OpenCV项目。 Windows下调试 首先我们编写代码&#xff0c;并在Windows/IDEA下调试通过。 下载Windows版安装包&#xff0…

macbook pro 2018 安装 arch linux 双系统

文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候&#xff0c;mac 的键盘是没法用的&#…

堆宝塔(Python)

作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于…

在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)

分布式ID组件&#xff1a;黄金链路上的关键基石 在现代分布式系统中&#xff0c;分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件&#xff0c;它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题&#xff0c;黄金链路上的…

【armv8 / armv9】: MMU深度学习

文章目录 一、MMU概念介绍二、虚拟地址空间和物理地址空间2.1、(虚拟/物理)地址空间的范围2.2、物理地址空间有效位(范围) 三、Translation regimes四、地址翻译/几级页表&#xff1f;4.1、思考&#xff1a;页表到底有几级&#xff1f;4.2、以4KB granule为例&#xff0c;页表的…

FreeRTOS教程1 基础知识

目录 1、准备材料 2、学习目标 3、前提知识 3.1、FreeRTOS简介 3.2、源码函数命名规律 4、动手创建一个FreeRTOS空工程 4.1、CubeMX相关配置 4.1.1、工程基本配置 4.1.2、时钟树配置 4.1.3、外设参数配置 4.1.4、外设中断配置 4.2、生成代码 4.2.1、配置Project Ma…

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…

ubuntu安装使用eigen(vscode)

1、eigen安装 安装命令如下&#xff1a; sudo apt-get update sudo apt-get install libeigen3-dev 默认安装路径为&#xff1a; /usr/include/eigen3 安装版本查询命令&#xff1a; pkg-config --modversion eigen3 2、CMakeLists.txt cmake_minimum_required(VERSION 3.…

21、电源管理入门之芯片设计中的电源管理

目录 1. 关于PCSA和SCP 2. 关于PSCI和SCMI 3. 关于芯片SoC设计中的一些要点 参考: 这里以ARM为例来进行说明,我们在做驱动软件的时候,就需要跟硬件SoC里面的IP打交道,通过操作寄存器来实现硬件功能。之前的文章:ARM SCP入门-AP与SCP通信中3和4章节已经进行了简单介绍,…

[MYSQL数据库]--表的增删查改和字段类型

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的增…

LeetCode203:移除链表元素

题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 解题思想 使用虚拟头节点 代码 struct ListNode {int val;ListNode* next;ListNode() :val(0), next(nullptr) {};ListNode(i…

使用IDEA远程Debug调试

文章目录 背景配置IDEA设置启动脚本改造 细节细节1&#xff1a;停在本地断点&#xff0c;关闭程序后会继续执行吗?细节2&#xff1a;jar包代码和本地不一致会怎么样&#xff1f;细节3&#xff1a;日志打印在哪里&#xff1f;细节4&#xff1a;调试时其他人会不会卡住&#xff…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

MVO-CNN-LSTM多输入时序预测|多元宇宙优化算法-卷积-长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…

mysql题库详解

1、如何创建和删除数据库&#xff1f; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别&#xff1f; 1&#xff09;事务&#xff1a;MyISAM 不支持事务 InnoDB 支持 2&#xff09;行锁/表锁&#xff1a;MyISAM 支持表级锁…