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);}}}


原创粉丝点击