岛屿填充(并查集/洪水填充)
题目链接:https://leetcode.cn/problems/number-of-islands/submissions/591894989/
题意:
给你一个01 grid,只有上下左右都有1才能链接成一座岛屿(斜着不算),让你求能连成多少个岛屿
思路:
并查集:
把grid每个坐标转化为数字(pos=x*col+y),存储在一维数组father中便于并查集的实现
先把ans设置成为所有1的个数,再把满足条件的1(遍历一遍grid,每当遇到1时看它上边和左边是不是1(注意数组别越界)如果是就merge掉) merge,让ans-merge次数,此时ans就是岛屿总数
class Solution { public: int ans=0; int father[10000000]; void build() { for(int i=0;i<10000000;i++)father[i]=i; } int find(int x) { if(x!=father[x]) { father[x]=find(father[x]); } return father[x]; } void merge(int x,int y) { if(find(x)!=find(y)) { father[find(x)]=find(y); ans--; } } int pos(int x,int y,int m) { return x*m+y; } int numIslands(vector<vector<char>>& grid) { build(); int n=grid.size(); int m=grid[0].size(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(grid[i][j]=='1') { ans++; } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(grid[i][j]=='1'){ if(i>0&&grid[i-1][j]=='1')merge(pos(i,j,m),pos(i-1,j,m)); if(j>0&&grid[i][j-1]=='1')merge(pos(i,j,m),pos(i,j-1,m)); } } } return ans; } };
洪水填充:遍历,遇到1 dfs感染,将感染到的格子换成不是1的字符(最优解:复杂度O(N*M))
class Solution { public: int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int numIslands(vector<vector<char>>& grid) { int n=grid.size(); int ans=0; int m=grid[0].size(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(grid[i][j]=='1') { dfs(n,m,i,j,grid); ans++; } } } return ans; } void dfs(int n,int m,int x,int y,vector<vector<char>>&grid) { if(x<0||x>=n||y<0||y>=m||grid[x][y]!='1')return; grid[x][y]='2'; for(int i=0;i<4;i++) { int nx=x+dx[i];int ny=y+dy[i]; dfs(n,m,nx,ny,grid); } } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现