Leetcode岛屿问题

岛屿个数问题

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

例如:

输入:
11110
11010
11000
00000

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

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

class Solution {
public:
    int numIslands(vector>& 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>& 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>& grid) {

        int row = grid.size();
        if(row == 0)
            return 0;
        int col = grid[0].size();
        int max_num = 0;
        for(int i=0; i >& 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 个黄色的边: 

Leetcode岛屿问题_第1张图片

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

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

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

int islandPerimeter(vector>& grid) {
    int row = grid.size();
    if(row == 0)
        return 0;
    int col = grid[0].size();
    int count = 0;
    for(int i=0; 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 岛屿问题

 

你可能感兴趣的:(leetcode,算法,职场和发展)