Leetcode岛屿问题

岛屿个数问题

1 是陆地, 0 是水, 只考虑上下左右四个方向相邻

例如:

输入:
11110
11010
11000
00000

输出: 1
思路: 遍历二维数组, 如果是 1, 就把它上下左右都感染为 0, 岛屿个数 +1

遍历完成, 最后返回岛屿个数 (感染的时候可以用递归)

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int h = (int)grid.size();
        if(h == 0) return 0;
        int w = (int)grid[0].size();
        int count = 0;
        int i, j;
        for(i=0; i<h; i++)
        {
            for(j=0; j<w; j++)
            {
                if(grid[i][j] == '1')
                {
                    count++;
                    infect(grid, i, j, w, h);
                }
            }
        }
        return count;        
    }

    void infect(vector<vector<char>>& grid, int i, int j, int w, int h)
    {
        if(i < 0 || i >= h || j < 0 || j >= w || grid[i][j] != '1')
            return ;
        grid[i][j] = '0';

        infect(grid, i-1, j, w, h);
        infect(grid, i+1, j, w, h);
        infect(grid, i, j-1, w, h);
        infect(grid, i, j+1, w, h);
    }
};

最大岛屿的面积

class Solution {
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {

        int row = grid.size();
        if(row == 0)
            return 0;
        int col = grid[0].size();
        int max_num = 0;
        for(int i=0; i<row; i++) {
            for(int j=0; j<col; j++) {
                if(grid[i][j] == 1) {
                    max_num = max(max_num, dfs(grid, i, j, row, col));
                }
            }
        }
        return max_num;
    }

    // 主要的目的是把上下左右四个位置的cell都set为0, set一个就相当于面积加1
    int dfs(vector< vector<int> >& grid, int i, int j, int row, int col) {
        if(i >= 0 && i < row && j >= 0 && j < col && grid[i][j] == 1) {
            grid[i][j] = 0;
            return 1 + dfs(grid, i-1, j, row, col) 
                     + dfs(grid, i+1, j, row, col)
                     + dfs(grid, i, j-1, row, col)
                     + dfs(grid, i, j+1, row, col);
        }
        return 0;
    }
};

岛屿周长问题

[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]

答案: 16 解释: 它的周长是下面图片中的 16 个黄色的边: 

4+4+(4-2-2)+(4-2)+(4-2)+4+(4-2-2)=16

对于最左边的cell, 因为一上来就是+4, 所以代表把整个这一行的变成都算进去了。

接下来对不是最左边的cell,因为只可能贡献上下的cell了,所以-2(左右两条边不会有用了),然后再考虑上下,如果不是最上面的cell, 那么说明上下的边也不会贡献出来做为边界,从而再-2.

int islandPerimeter(vector<vector<int>>& grid) {
    int row = grid.size();
    if(row == 0)
        return 0;
    int col = grid[0].size();
    int count = 0;
    for(int i=0; i<row; i++)
       for(int j=0; j<col; j++)
          if(grid[i][j] == 1)
             count += 4;
             //如果是上面的cell
             if(i > 0 && grid[i-1][j] == 1)
                count -= 2;
             //如果是左边的cell
             if(j > 0 && grid[i][j-1] == 1)
                count -= 2;
    return count;    

其他链接: 

LeetCode刷题—岛屿问题_RuiW_97的博客-CSDN博客_leetcode 岛屿问题

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值