Google算法题:岛屿计数II
来源:互联网 发布:网络数字高清摄像头 编辑:程序博客网 时间:2024/05/16 13:04
题目
九章算法链接
给出一个m行n列的网格地图,每个位置为0或1,0表示海水1表示陆地。一开始地图全为0(没有陆地)。每次在一个位置加入一块陆地,返回此时地图中陆地的总块数(相邻陆地统计时为同一块陆地)。
Example:
操作#1: addLand(0, 0) turns the water at grid[0][0] into a land.
操作#2: addLand(0, 1) turns the water at grid[0][1] into a land.
操作#3: addLand(1, 2) turns the water at grid[1][2] into a land.
操作#4: addLand(2, 1) turns the water at grid[2][1] into a land.
返回答案数组: [1, 1, 2, 3]
你可以做到复杂度O(k log mn)吗?其中k为操作次数。
分析
未编译版本
方法一:
时间消耗主要在dfs合并过程
SC = O(m*n)
方法二:
并查集,将题目中的发号变成所有新加入的陆地都指向同一个节点,作为该陆地的起始点
当要合并两个陆地,只要把一个陆地的起始点指向另外一个节点即可
时间消耗主要是从接壤的陆地找到该陆地的起始点
但是经过前面的计算,已经让一个陆地的所有陆地指向其实点了,只是合并后,并不是多有陆地指向同一个点,递归找其实的次数为合并的岛屿数,但是已经是尽量小了
代码
class Solution{int m, int n;int[][] map;int[][] islands;int islandCount;public void initMap(int m, int n){this.m = m;this.n = n;map = new int[m][n];islands = new int[m][n];}public int addIsland(int x, int y){map[x][y] = 1;return countIsland(int x, int y);}int islandNum;public int countIsland(int x, int y){int up = (x-1)>=0 ? map[x-1][y] : 0;//上边有,则为格子对应值,否则默认为海int left = (y-1)>=0 ? map[x][y-1] : 0;int right = (y+1)<n ? map[x][y+1] : 0;int down= (x+1)<m ? map[x+1][y] : 0;if(up+left+right+down==0){//四周全是海,则是新的岛屿islandCount++;islandNum++;islands[x][y] = islandNum;//给岛屿编号}else{if(up==1)islands[x][y] = islands[x-1][y];if(right==1){if(islands!=0 && islands[x][y]!=islands[x][y+1]){dfs(x, y+1, islands[x][y+1], islands[x][y]);//如果之前陆地已经划归给别的岛屿了,则与之接壤的岛屿需要被合并islandCount--;}elseislands[x][y] = islands[x][y+1];}if(down==1){if(islands!=0 && islands[x][y]!=islands[x+1][y]){dfs(x+1, y, islands[x+1][y], islands[x][y]);//如果之前陆地已经划归给别的岛屿了,则与之接壤的岛屿需要被合并islandCount--;}elseislands[x][y] = islands[x+1][y];}if(left==1){if(islands!=0 && islands[x][y]!=islands[x][y-1]){dfs(x, y-1, islands[x][y-1], islands[x][y]);//如果之前陆地已经划归给别的岛屿了,则与之接壤的岛屿需要被合并islandCount--;}elseislands[x][y] = islands[x][y-1];}}return islandCount;}void dfs(int x, int y, int sor, int tar){islands[x][y] = tar;if(x-1>=0 && islands[x-1][y]==sor){dfs(x-1, y, sor, tar);}if(y+1<n && islands[x][y+1]==sor){dfs(x, y+1, sor, tar);}if(x+1<m && islands[x+1][y]==sor){dfs(x+1, y, sor, tar);}if(y-1>=0 && islands[x][y-1]==sor){dfs(x, y-1, sor, tar);}}}
阅读全文
0 0
- Google算法题:岛屿计数II
- Google 2016 面试题5 | 岛屿计数2
- Google 2016 面试题5 | 岛屿计数2
- 算法题:科学计数法
- 岛屿面积有多大(dfs算法)
- 岛屿算法实现——JAVA
- 计数算法
- 一道google算法题
- Google算法题:轴对称
- 算法谜题116 轮空计数
- Google面试题 | 数字计数
- Google面试题:数字计数
- 九章算法面试题81 岛屿的个数
- 51nod 1276 岛屿的数量 离线算法乱搞
- 【算法题】word-break-ii
- Google面试一道算法题
- Google算法题:寻找中位数
- Google算法题:贪吃蛇
- caffe框架下目标检测——faster-rcnn实战篇问题集锦
- Android开发笔记: Socket通信--【带例子】
- BAT级别和待遇
- Ubuntu上安装SSH
- [Leetcode] 46, 47, 77
- Google算法题:岛屿计数II
- 动态语言,静态语言,强类型语言,弱类型语言的区别
- 半年总结
- MATLAB编程->Reading capture using Tshark did not work for the following reason
- 阿里测试笔试-组队问题
- Java NIO系列教程(十二) Java NIO与IO
- mysql-5.7.19-winx64服务无法启动解决方案
- 王爽 《汇编语言》 读书笔记 四 第一个程序
- jemter的参数化(一)