【一次过】Lintcode 897. 海岛城市

39 篇文章 1 订阅
22 篇文章 0 订阅

给一个n x m的矩阵,矩阵的值有0120代表海,1代表海岛,2代表海岛上的城市(你可以看做2是建立在1的上面,即2也也同时代表海岛)。
如果21相邻,那么这两个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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值