LeetCode 200. 岛屿数量

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

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

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

 

解法

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

 

代码

复制代码
 1 class UnionFind {
 2 public:
 3     vector<int> father;
 4     UnionFind(int num) {
 5         for (int i = 0; i < num; i++) {
 6             father.push_back(i);    //每个人都指向自己
 7         }
 8     }
 9     int Find(int n) {
10         //非递归版本 
11         /*
12         while (father[n] != n) {
13             n = father[n];
14         }
15         return n;
16         */
17         //递归
18         if (father[n] == n)
19             return n;
20         father[n] = Find(father[n]);
21         return father[n] ;
22     }
23     void Union(int a, int b) {
24         int fa = Find(a);
25         int fb = Find(b);
26         father[fb] = fa;
27     }
28 };
29 
30 
31 class Solution {
32 public:
33     int directions[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
34     int encode(int i,int j,int n){
35         return i*n+j;
36     }
37     int numIslands(vector<vector<char>>& grid) {
38         int M = grid.size();
39         if(M == 0)
40             return 0;
41         int N = grid[0].size();
42         if(N == 0)
43             return 0;
44         UnionFind UF(M*N);
45         for(int i = 0;i < M;i++){
46             for(int j =0;j < N;j++){
47                 if(grid[i][j] == '1'){
48                     for(int d =0;d < 4; d++){
49                         int di = directions[d][0];
50                         int dj = directions[d][1];
51                         if(i+di >= 0 && i+di < M && j+dj >=0&& j+dj < N &&
52                             grid[i+di][j+dj] == '1')
53                         {
54                             UF.Union(encode(i,j,N),encode(i+di,j+dj,N));
55                         }
56                     }
57                 }
58             }
59         }
60         
61         int res = 0;
62         for(int i =0;i < M;i++){
63             for(int j = 0; j< N;j++){
64                 if(grid[i][j] == '1'){
65                     int id = encode(i,j,N);
66                     if(UF.Find(id) == id)
67                         res++;
68                 }
69             }
70         }
71         
72         return res;
73         
74     }
75 };
View Code
复制代码

 

posted on   itdef  阅读(169)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2016-05-24 字典类的代码的学习

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示