随手练——LintCode 433 - 小岛数量

LintCode 433: https://www.lintcode.com/problem/number-of-islands/description

LintCode 434: https://www.lintcode.com/problem/number-of-islands-ii/description(问法变了一下,思想还是一样的。)

解题思想:“感染“,从头开始遍历,碰到1,res++,开始感染,把所有相邻的1全部变成0,遍历完成,res就是结果。

题目是在B站上看到的一个老师的讲解:https://www.bilibili.com/video/av42241070/?p=8,不知道视频能存活多久。不过老师讲的是感染成 2,感染成 0

,也是一样的。

这题要注意的就是测试数据里有一个空数据,一定要处理,网站给看哪个样例不过,如果是看不到测试数据的,又该自闭了。

class Solution {
public:
    /**
     * @param grid: a boolean 2D matrix
     * @return: an integer
     */
    void infect(vector<vector<bool>> &a,int i,int j,int N,int M) {
        if (i < 0 || i >= N || j < 0 || j >= M||a[i][j]!=1) {
            return;
        }
        a[i][j] = 0;
        infect(a, i + 1, j, N, M);
        infect(a, i - 1, j, N, M);
        infect(a, i, j + 1, N, M);
        infect(a, i, j - 1, N, M); 
    }
    int numIslands(vector<vector<bool>> &grid) {
        // write your code here
        if(grid.empty())
        return 0;
        int N = grid.size();
        int M = grid[0].size();
        int res = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (grid[i][j] == 1) {
                    infect(grid, i, j, N, M);
                    res++;
                }
            }
        }
        //cout << res << endl;
        return res;
    }
};

 问题还有个升级:

将海域一切为二,分开求,但是最终还是要给出整片海域的岛屿数量。

就是比如:左边求出来是1个,右边求出来是2个,但其实还是一个岛屿。

牵扯到并查集(数据结构——并查集(2019-02-05 17:00)),每个点,在被感染的同时,标记上是被哪个点为中心感染的,最后撸两边的边界,不是同一个点感染的,就Union。

posted @ 2019-02-08 10:06  czc1999  阅读(175)  评论(0编辑  收藏  举报