力扣hot---岛屿数量

news2024/11/25 10:47:28

思路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:

明天继续更啦~

前序中序遍历二叉树

并查集做该道题

bfs的python写法

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

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

相关文章

Qt 类的前置声明和头文件包含

1. 在头文件中引入另一个类经常有两种写法 1&#xff09;前置声明 2&#xff09;头文件包含 #ifndef FRMCOUPLE2_H #define FRMCOUPLE2_H#include <QWidget> //头文件包含namespace Ui { class frmcouple2; }//前置声明&#xff1a;QPushButton frmchkeyboard…

java网络编程 01 IP,端口,域名,TCP/UDP, InetAddress

01.IP 要想让网络中的计算机能够互相通信&#xff0c;必须为计算机指定一个标识号&#xff0c;通过这个标识号来指定要接受数据的计算机和识别发送的计算机&#xff0c;而IP地址就是这个标识号&#xff0c;也就是设备的标识。 ip地址组成&#xff1a; ip地址分类&#xff1a;…

基础小白快速入门web前端开发技术------>web概述

Web概述 我们在编程的学习中&#xff0c;随着学习的深入&#xff0c;我们会理解到WEB这个东西&#xff0c;那么 web究竟是个啥&#xff0c;到底该咋用&#xff1f; web&#xff0c;是网站的英文意思&#xff0c;又被称作“下一代Web3.0&#xff0c;互联网”&#xff0c;是在We…

2024.3.6

利用c语言通过sqlite3实现数据库增删改查&#xff1a; #include<myhead.h> int do_add(sqlite3 * ppDb) {char sql_insert[128]"insert into worker values ";char info[500]"";printf("请输入要添加的员工信息&#xff1a;\n");scanf(&…

Android开发揭秘,我了解到的面试的一些小内幕

前言 尤其是在最近一段时间内&#xff0c;感觉一天天的时间过得又慢又快&#xff0c;慢的是感觉复工了以后在公司的8.9个小时简直算是煎熬了&#xff0c;快的是常常感觉时间一天天&#xff0c;一月月的过去了&#xff0c;可是发现自己还在原路踏步走。看似每天忙成狗&#xff…

大学四年我从非科班到互联网大厂之路

文章目录 一、两度高考、依然选错&#xff1f;二、初来乍到、陷入囹圄三、破局重生、从头再来四、找实习的坎坷之路五、提前结束实习&#xff0c;开始秋招六、秋招一路凯歌七、写在最后&#xff1a;人生是一场长久的旅途 很久没来CSDN上写过文章了&#xff0c;上一次写已经是20…

HTML静态网页成品作业(HTML+CSS)——新年春节介绍网页设计制作(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示1、首页2、子页13、子页2 三、代码目录四、网站代码HTML部分代码CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0…

Android开发经典实战,Android面试题目

关于Android的近况 大家都知道&#xff0c;今年移动开发不那么火热了&#xff0c;完全没有了前两年Android开发那种火热的势头&#xff0c;如此同时&#xff0c;AI热火朝天&#xff0c;很多言论都说Android不行了。其实不光是Android&#xff0c;iOS也有类似的言论。 那么到底…

人工智能如何重新定义数据迁移:利用人工智能趋势实现工作空间的平稳过渡

【由于上篇文章中IAB关于数据迁移并没有讨论人工智能技术如何整整推动和影响未来的数据迁移工作&#xff0c;因此特整理了两篇前沿文章&#xff0c;供大家参考 - - 对第六篇关于数据迁移的一个补充&#xff08;1&#xff09;​​​​​​​】 拥抱变化&#xff1a;数据迁移的发…

案例介绍:信息抽取技术在汽车销售与分销策略中的应用与实践

一、引言 在当今竞争激烈的汽车制造业中&#xff0c;成功的销售策略、市场营销和分销网络的构建是确保品牌立足市场的关键。作为一名经验丰富的项目经理&#xff0c;我曾领导一个专注于汽车销售和分销的项目&#xff0c;该项目深入挖掘市场数据&#xff0c;运用先进的信息抽取…

C++学习第七天(string类)

1、学习string的原因&#xff1f; C语言中的字符串 C语言中&#xff0c;字符串是以‘\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;而且底层空间需要用户自己管…

决策树实验分析(分类和回归任务,剪枝,数据对决策树影响)

目录 1. 前言 2. 实验分析 2.1 导入包 2.2 决策树模型构建及树模型的可视化展示 2.3 概率估计 2.4 绘制决策边界 2.5 决策树的正则化&#xff08;剪枝&#xff09; 2.6 对数据敏感 2.7 回归任务 2.8 对比树的深度对结果的影响 2.9 剪枝 1. 前言 本文主要分析了决策树的分类和回…

XSS漏洞--概念、类型、实战--分析与详解[结合靶场pikachu]

目录 一、XSS概念简述 1、XSS简介&#xff1a; 2、XSS基本原理&#xff1a; 3、XSS攻击流程&#xff1a; 4、XSS漏洞危害&#xff1a; 二、XSS类型&#xff1a; 1、反射型XSS&#xff1a; 2、存储型XSS&#xff1a; 3、DOM型XSS&#xff1a; 三、靶场漏洞复现(pikach…

C++(13)——string类

string类的由来 C语言中&#xff0c;字符串是以 \0‘ 结尾的一些字符的集合&#xff0c;为例操作方便&#xff0c;C标准库中提供了一些str 系列的库函数&#xff0c;但是这些库函数与字符串是分开的&#xff0c;不太符合OOP&#xff08;封装、继承和多态&#xff09;的思想&am…

云原生基础知识:容器技术的历史

容器化的定义&#xff1a; 容器化是一种轻量级的虚拟化技术&#xff0c;将应用程序及其所有依赖项&#xff08;包括运行时、系统工具、系统库等&#xff09;打包到一个称为容器的单独单元中。容器提供了一种隔离的执行环境&#xff0c;使得应用程序可以在不同的环境中运行&…

splay学习笔记重制版

以前写的学习笔记&#xff1a;传送门 但是之前写的比较杂乱&#xff0c;这里重制一下 问题背景 假设我们要维护一个数据结构&#xff0c;支持插入、删除、查询某个值的排名&#xff0c;查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树&#xff0c;也就是左子树权值&l…

Java | 在消息对话框中显示文本

首先需要导入JOptionPane类&#xff0c;JOptionPane类属于Swing组件中的一种&#xff0c;其导入方式如下&#xff1a; import javax.swing.JOptionPane;可以使用JOptionPane的showMessageDialog方法显示消息文本。 参数格式&#xff1a; JOptionPane.showMessageDialog(paren…

jdk安装,配置path系统变量

直接点击安装 不要包含空格&#xff0c;中文字符 3.找到刚刚的路径&#xff0c;看一下&#xff0c;有东西就说明安装对了 配置path winr输入sysdm.cpl点击确定 全部依次点击 确定 即可。 验证jdk是否安装成功 看java、javac是否可用看java、javac版本号是否无问题 win…

解密程序员的“藏宝图”:我的祖传代码大公开

程序员是如何看待“祖传代码”的&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一位充满好奇心和分享热情的程序员。今天&#xff0c;我要为大家揭开我心中的“藏宝图”——那些我认为值得传世的祖传代码。让我们一同踏上这场奇妙的代码冒险之旅吧&#xff01; 宝物一…

【广度优先搜索】【堆】【C++算法】407. 接雨水 II

作者推荐 【二分查找】【C算法】378. 有序矩阵中第 K 小的元素 本文涉及知识点 广度优先搜索 堆 LeetCoce407. 接雨水 II 给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨…