java代码实现:
第一种:
用了类似感染的方法,就是一个节点出发,如果此时这个节点没被感染,且是陆地,就可以进入遍历,将其邻接的陆地全部遍历一遍,标志数组sign相应位置至为1.然后一次遍历一块陆地,能遍历几次就代表有几块陆地。文章来源:https://www.toymoban.com/news/detail-628524.html
class Solution {
public int numIslands(char[][] grid) {
int [][] sign = new int [grid.length][grid[0].length];
int sum = 0;
for(int i = 0; i< grid.length;i++){
for(int j = 0; j<grid[i].length;j++){
if(!(grid[i][j] == '0'||sign[i][j] == 1)){
sum += change(grid,sign,i,j);
}
}
}
return sum;
}
public int change(char[][]grid,int[][]sign,int i, int j){
if(grid[i][j] == '0'||sign[i][j] == 1){
sign[i][j] = 1;
return 0;
}else{
sign[i][j] = 1;
if(j+1<grid[i].length){
change(grid,sign,i,j+1);
}
if(i+1<grid.length){
change(grid,sign,i+1,j);
}
if(j-1>=0){
change(grid,sign,i,j-1);
}if(i-1>=0){
change(grid,sign,i-1,j);
}
return 1;
}
}
}
第二种:
这种方法相较于第一种有了不错的优化,没有建立新的数组,而是再原来的数组的基础上进行改动。和上面那个思路差不多,没一次遍历会将一块陆地变为海洋将其置为’0‘,当没有陆地的就遍历完成。文章来源地址https://www.toymoban.com/news/detail-628524.html
class Solution {
public static int numIslands(char[][] grid) {
int sum = 0;
for(int i = 0; i< grid.length;i++){
for(int j = 0; j<grid[i].length;j++){
if(!(grid[i][j] == '0')){
change(grid,i,j);
sum ++;
}
}
}
return sum;
}
public static void change(char[][] grid, int i, int j){
if(grid[i][j] == '0'){
return ;
}else{
grid[i][j] = '0';
if(j+1<grid[i].length){
change(grid,i,j+1);
}
if(i+1<grid.length){
change(grid,i+1,j);
}
if(j-1>=0){
change(grid,i,j-1);
}if(i-1>=0){
change(grid,i-1,j);
}
return ;
}
}
}
到了这里,关于力扣真题:200. 岛屿数量(两种实现方法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!