leetcode 200岛屿的个数

主要考察图搜索:
方法一:染色法,时间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岛屿的个数的更多相关文章
- Leetcode 200. 岛屿的个数(扩展)
1.题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...
- LeetCode 200. 岛屿的个数(Number of Islands)
题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1 ...
- LeetCode 200.岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...
- Leetcode 200.岛屿的数量 - DFS、BFS
Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...
- Java实现 LeetCode 200 岛屿数量
200. 岛屿数量 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. ...
- 【LeetCode】200. 岛屿的个数
题目 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1:输 ...
- LeetCode 200. 岛屿数量
习题地址 https://leetcode-cn.com/problems/number-of-islands/ 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水 ...
- 力扣Leetcode 200. 岛屿数量
岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网 ...
- [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 ...
随机推荐
- ELF文件格式理解
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自 ...
- linux shell 数组的使用
引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...
- Linux和Windows双系统下Windows系统插入耳机没有声音
我的笔记本装了Windows7和Debian双系统后,在Windows7下,插入耳机竟然没有声音. 按常规思路分析:首先考虑是耳机问题还是笔记本电脑问题.确定耳机没问题后问题就在笔记本身上了.而问题在 ...
- Linux 的帐号与群组:有效与初始群组、groups, newgrp
关于群组: 有效与初始群组.groups, newgrp 认识了帐号相关的两个档案 /etc/passwd 与 /etc/shadow 之后,您或许还是会觉得奇怪, 那么群组的设定档在哪里?还有,在 ...
- 2019-2020-1 20199319《Linux内核原理与分析》第四周作业
MenuOS的构造 基础知识 1.操作系统的两把宝剑:①中断上下文的切换:保存现场和恢复现场:②进程上下文的切换. 2.Linux内核以A.B.C.D方式命名:A和B变得无关紧要,C是内核的真实版本, ...
- Hibrenate实现根据实体类自动创建表或添加字段
Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 实现: 在配置hibernate的配置文件中将hbm2ddl.auto设置为update,如:Xml代码&l ...
- vim简明教程--半小时从入门到精通
https://download.csdn.net/download/qccz123456/10567716 vim三种模式:命令模式.插入模式.底行模式.使用ESC.i.:切换模式. vim [路径 ...
- zencart安全辅助小脚本
在includes/application_top.php最后一行加入require('fish.php'); 将下面代码保存为fish.php <?php function customErr ...
- WTL自定义控件:SubclassWindow的实现
自定义了一个edit类如下: class CCheckEditEx : public CWindowImpl< CCheckEditEx, CEdit > 其SubclassWindow函 ...
- iOS设置UITableViewCell的选中时的颜色
1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectio ...