习题地址 https://leetcode-cn.com/problems/number-of-islands/

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:

输出: 

示例 2:

输入:

输出: 

解法

广度遍历或者使用并查集 这里使用并查集。注意将二维数组转换为一维的方法

代码

 class UnionFind {
public:
vector<int> father;
UnionFind(int num) {
for (int i = ; i < num; i++) {
father.push_back(i); //每个人都指向自己
}
}
int Find(int n) {
//非递归版本
/*
while (father[n] != n) {
n = father[n];
}
return n;
*/
//递归
if (father[n] == n)
return n;
father[n] = Find(father[n]);
return father[n] ;
}
void Union(int a, int b) {
int fa = Find(a);
int fb = Find(b);
father[fb] = fa;
}
}; class Solution {
public:
int directions[][] = {{,},{-,},{,},{,-}};
int encode(int i,int j,int n){
return i*n+j;
}
int numIslands(vector<vector<char>>& grid) {
int M = grid.size();
if(M == )
return ;
int N = grid[].size();
if(N == )
return ;
UnionFind UF(M*N);
for(int i = ;i < M;i++){
for(int j =;j < N;j++){
if(grid[i][j] == ''){
for(int d =;d < ; d++){
int di = directions[d][];
int dj = directions[d][];
if(i+di >= && i+di < M && j+dj >=&& j+dj < N &&
grid[i+di][j+dj] == '')
{
UF.Union(encode(i,j,N),encode(i+di,j+dj,N));
}
}
}
}
} int res = ;
for(int i =;i < M;i++){
for(int j = ; j< N;j++){
if(grid[i][j] == ''){
int id = encode(i,j,N);
if(UF.Find(id) == id)
res++;
}
}
} return res; }
};

LeetCode 200. 岛屿数量的更多相关文章

  1. Java实现 LeetCode 200 岛屿数量

    200. 岛屿数量 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. ...

  2. 力扣Leetcode 200. 岛屿数量

    岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网 ...

  3. Leetcode之深度优先搜索(DFS)专题-200. 岛屿数量(Number of Islands)

    Leetcode之深度优先搜索(DFS)专题-200. 岛屿数量(Number of Islands) 深度优先搜索的解题详细介绍,点击 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计 ...

  4. Leetcode 200.岛屿的数量 - DFS、BFS

    Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...

  5. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  6. Leetcode题目200.岛屿数量(BFS+DFS+并查集-中等)

    题目描述: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...

  7. Leetcode 200. 岛屿的个数(扩展)

    1.题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...

  8. LeetCode 200.岛屿的个数

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  9. LeetCode 200. 岛屿的个数(Number of Islands)

    题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1 ...

随机推荐

  1. C# 调用OpenCVSharp报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”

    一.描述问题 当托管代码调用非托管代码的时候,经常会出现如下报错:“尝试读取或写入受保护的内存.这通常指示其他内存已损坏”. 二.原因分析 由于非托管代码的内存指针的回收是由非托管代码自身手动完成的, ...

  2. python基础(36):pymysql模块

    1. pymysql模块 在使用pymysql模块前需要学习数据库MySQL:<MySQL基础>. 1.1 pymysql的下载和使用 看完MySQL基础,我们都是通过MySQL自带的命令 ...

  3. IS guide:Eric Steven Raymond in《How To Become A Hacker》

    Learn how to program.This, of course, is the fundamental hacking skill. If you don't know any comput ...

  4. stream根据条件过滤List<Object>

    List<String> filterUser= new ArrayList<>(); filterUser.add("张三"); List<User ...

  5. Linux系统学习 十四、VSFTP服务—配置文件解析、客户端使用

    3.配置文件解析 默认配置选项: 一般情况下不允许匿名用户登录 全局配置选项:(手工添加) listen_address=192.168.4.1             #设置监听地址 listen_ ...

  6. ABC135记录

    date: 2019-07-28 A - Harmony 题目大意: 给你两个不同的整数A和B,要求你找到一个整数K,同时满足|A-K|=|B-K|.找不到时,输出"IMPOSSIBLE&q ...

  7. 池化技术(二)HikariCP是如何管理数据库连接的?

    基于依赖程序的版本信息:HikariCP:3.3.1               驱动程序mysql-connector-java:8.0.17 上一篇:Druid是如何管理数据库连接的 零.类图和流 ...

  8. C++ std::array 基本用法

    #include <iostream> #include <string> #include <array> using namespace std; // htt ...

  9. STM32基本GPIO操作:点灯(库函数+寄存器)

    社团作业=_= 开发版上的LED灯负极连接在PB5口,正极串联一510Ω电阻后与3.3V相连 若开发板不带LED灯则需要自行连接,务必串联一个合适的电阻防止LED灯烧坏 零.一个有趣的延时函数 来自于 ...

  10. [考试反思]1113csp-s模拟测试113:一念

    在这么考下去可以去混女队了2333 两天总分rank14,退役稳稳的 的确就是没状态.满脑子都是<包围保卫王国>ddp/LCT/ST,没好好考试. 我太菜了写题也写不出来考试也考不好(显然 ...