主要考察图搜索:

方法一:染色法,时间O(mn)

遍历一遍,再通过BFS或DFS将所有临近岛屿染色,使用dfs时将numIslands中的bfs换成dfs即可;

/*****
遍历所有的点:
只要遇见陆地(1),投放1枚原子弹,爆炸冲击波以BFS或DFS的形式向外扩散,使得自身及所有相邻区域全部夷为平地;
最终遍历结束,原子弹使用数目即为岛屿次数
*****/ class Solution {
public:
vector<vector<int> > dirs={{-,},{,},{,},{,-}};
int numIslands(vector<vector<char>>& grid) {
int m=grid.size();
if(m==) return ;
int n=grid[].size();
if(n==) return ;
int res=;
for(int i=;i<m;i++){
for(int j=;j<n;j++){
if(grid[i][j]==''){
res++;bfs(grid,i,j);
}
}
}
return res;
}
void dfs(vector<vector<char>>&grid,int i,int j){
int m=grid.size(),n=grid[].size();
if(i< || i>=m ||j< ||j>=n||grid[i][j]!='') return;
grid[i][j]='';
for(auto dir:dirs){
dfs(grid,i+dir[],j+dir[]);
}
}
void bfs(vector<vector<char>>&grid,int i,int j){
int m=grid.size(),n=grid[].size();
queue<pair<int,int>> q;
pair<int,int> p;
p.first=i,p.second=j;
q.push(p);
while(!q.empty()){
p=q.front();
q.pop();
int a=p.first,b=p.second;
if(a>= && a<m && b>= && b<n && grid[a][b]==''){
grid[a][b]='';
for(auto dir:dirs){
pair<int,int> tmp;
tmp.first=a+dir[],tmp.second=b+dir[];
q.push(tmp);
}
}
}
}
};

第二种:并查集的方法,

class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
if (M.empty()) return ;
int n = M.size(); vector<int> leads(n, );
for (int i = ; i < n; i++) { leads[i] = i; } // initialize leads for every kid as themselves int groups = n;
for (int i = ; i < n; i++) {
for (int j = i + ; j < n; j++) { // avoid recalculate M[i][j], M[j][i]
if (M[i][j]) {
int lead1 = find(i, leads);
int lead2 = find(j, leads);
if (lead1 != lead2) { // if 2 group belongs 2 different leads, merge 2 group to 1
leads[lead1] = lead2;
groups--;
}
}
}
}
return groups;
} private:
int find(int x, vector<int>& parents) {
return parents[x] == x ? x : find(parents[x], parents);
}
};

leetcode 200岛屿的个数的更多相关文章

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

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

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

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

  3. LeetCode 200.岛屿的个数

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

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

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

  5. Java实现 LeetCode 200 岛屿数量

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

  6. 【LeetCode】200. 岛屿的个数

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

  7. LeetCode 200. 岛屿数量

    习题地址 https://leetcode-cn.com/problems/number-of-islands/ 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水 ...

  8. 力扣Leetcode 200. 岛屿数量

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

  9. [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

随机推荐

  1. linux命令详解——lsof

    lsof全名list opened files,也就是列举系统中已经被打开的文件.我们都知道,linux环境中,任何事物都是文件, 设备是文件,目录是文件,甚至sockets也是文件.所以,用好lso ...

  2. Delphi ScrollBar组件

  3. 【异常】org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:

    1 Phoenix远程无法连接但是本地可以连接,详细异常 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bindin ...

  4. 外星人电脑出现the system is running in low graphics mode的解决方法

    问题现象: 执行删除GCC5.4.0: sudo  apt-get remove gcc gcc-5重启电脑后,就显示the system is running in low graphics mod ...

  5. Centos7.0 三种网络适配器

    VMnet0:桥接模式 VMnet1:主机模式 VMnet8:NAT模式 VMware Network Adepter VMnet1:宿主Host用于与 主机模式 虚拟网络进行通信的虚拟网卡 VMwa ...

  6. Linux系统组成和获取命令帮助1

    在GNU上边发布的都是源码,不可以直接拿来使用 源代码都是文本格式的,需要找个编译器编译成不同机器上使用的二进制,这样机器才可以运行的起来 英特儿的CPU有着x86,x64架构之分,x64又叫amd6 ...

  7. Cuda9.0安装

    CUDA 9.0安装笔记 最近实验室新购买两块K80的GPU.作为好奇的小猪,当然会自报奋勇去配置环境.在这篇博客中将会介绍在centos7下配置CUDA 9.0的步骤. 1. 什么是CUDA? 引用 ...

  8. tp6中使用微信支付sdk

    一.下载微信支付sdk 二.将lib文件夹下的文件复制到目录:extend->WxPay 将example文件夹下的WxPay.Config.php文件也复制到:extend->WxPay ...

  9. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

    垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...

  10. Confluence 6 插入一个文件到你的页面

    文件可以在页面中以缩略图或者链接的方式显示.我们有多种办法能够上传文件,请参考 Upload Files 页面. 你可以控制文件如何在你的页面中显示.文件在页面中显示的可用方法与你的文件类型有关. 插 ...