给一个n x m的矩阵,矩阵的值有0、1、2,0代表海,1代表海岛,2代表海岛上的城市(你可以看做2是建立在1的上面,即2也也同时代表海岛)。
如果2个1相邻,那么这两个1属于同一个岛。现在求至少有一个城市的海岛个数。
样例
样例1
输入:
[
[1,1,0,0,0],
[0,1,0,0,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,0,0,1]
]
输出: 0
解释:
有3个海岛,但是他们都不含有城市。
样例2
输入:
[
[1,1,0,0,0],
[0,1,0,0,1],
[0,0,2,1,2],
[0,0,0,0,0],
[0,0,0,0,2]
]
输出: 2
解释:
有3个海岛,有2个海岛含有城市。
注意事项
- 我们只考虑上下左右为相邻。
n <= 100,m <= 100。- 你可以假设矩阵的四个边都被海包围。
解题思路1:
与Lintcode 433:岛屿的个数类似。如果找到海岛,向上下左右四个方向递归地找邻接的岛,然后把海岛覆盖成海水,如果找到的是城市,把flag置为true
public class Solution {
/**
* @param grid: an integer matrix
* @return: an integer
*/
public int numIslandCities(int[][] grid) {
// Write your code here
if(grid == null || grid.length == 0)
return 0;
int count = 0;
for(int row = 0; row < grid.length; row++){
for(int col = 0; col < grid[row].length; col++){
if(grid[row][col] > 0){
flag = false;
helper(grid, row, col);
if(flag)
count++;
}
}
}
return count;
}
private boolean flag = false;
//查找以grid[row][col]为起点的上下左右四面有无的海岛城市,若有则置flag为true,同时将遍历的所有内容全部置0
private void helper(int[][] grid, int row, int col){
if(grid[row][col] == 2)
flag = true;
grid[row][col] = 0;
//left
if(col - 1 >= 0 && grid[row][col - 1] > 0)
helper(grid, row, col - 1);
//right
if(col + 1 < grid[row].length && grid[row][col + 1] > 0)
helper(grid, row, col + 1);
//Up
if(row - 1 >= 0 && grid[row - 1][col] > 0)
helper(grid, row - 1, col);
//down
if(row + 1 < grid.length && grid[row + 1][col] > 0)
helper(grid, row + 1, col);
return;
}
}

本文介绍了一种基于递归深度优先搜索的算法,用于计算给定矩阵中包含城市的海岛数量。算法通过遍历矩阵,对每个遇到的海岛进行标记并检查是否存在城市,以此来统计包含城市的海岛总数。
318

被折叠的 条评论
为什么被折叠?



