10.30每日一题
463. 岛屿的周长
首先想到的是遍历每一个格子,这样就可以找出所有的陆地格子,接下来要做的就是统计这些陆地格子的周长,格子的周长通过观察可以看到当这个格子的边是边界或者临近的格子是海洋的时候就是周长了,这样找到了判别的条件就可以开始写代码了。
class Solution {
public int islandPerimeter(int[][] grid) {
int x = grid.length;
int y = grid[0].length;
int sum = 0;
int[] dx = new int[]{0,1,0,-1};
int[] dy = new int[]{1,0,-1,0};
for(int i = 0; i < x; i++){
for(int j =0; j < y; j++){
if(grid[i][j] == 1){
int count = 0;
for(int k = 0; k < 4; k++){
int rx = i + dx[k];
int ry = j + dy[k];
if(rx < 0 || rx >= x || ry < 0 || ry >= y || grid[rx][ry] == 0){
count++;
}
}
sum = sum + count;
}
}
}
return sum;
}
}
第二种思路是用dfs的方法,因为是在网格之中,有上下左右四个方向,所以需要搜索四个方向。同时统计周长的方法像上面说的一样,就可以写出代码了。
class Solution {
public int islandPerimeter(int[][] grid) {
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1){
return dfs(grid, i, j);
}
}
}
}
int dfs(int[][] grid, int i, int j){
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length){
return 1;
}
if(grid[i][j] == 0){
return 1;
}
if(grid[i][j] != 1){
return 0;
}
grid[i][j] = 2;
return dfs(grid, i - 1, j) +
dfs(grid, i + 1, j) +
dfs(grid, i, j - 1) +
dfs(grid, i, j + 1);
}
}