463. 岛屿的周长
深度优先搜索
class Solution {
int m;
int n;
boolean[][] used;
int sum = 0;
int[][] move = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public int islandPerimeter(int[][] grid) {
m = grid.length;
n = grid[0].length;
used = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
/**
* 只会存在一个岛屿,因此只要找到1就可以终止这个循环
*/
if (grid[i][j] == 1) {
dfs(grid, i, j);
break;
}
}
}
return sum;
}
public void dfs(int[][] grid, int row, int col) {
/**
* 如果该数字已被使用过,就停止搜索
*/
if (used[row][col]) {
return;
}
for (int i = 0; i < 4; i++) {
used[row][col] = true;
int newRow = row + move[i][0];
int newCol = col + move[i][1];
/**
* 当下一个元素的索引越界或者值是0时,那条边就是边缘,就记录下次数
* 否则就可以正常搜索
*/
if (newRow < 0 || newRow >= m || newCol < 0 || newCol >= n || grid[newRow][newCol] == 0){
sum++;
}
else {
dfs(grid, newRow, newCol);
}
}
}
}
/**
* 时间复杂度 O(m×n)
* 空间复杂度 O(m×n)
*/
https://leetcode-cn.com/problems/island-perimeter/