zoukankan      html  css  js  c++  java
  • 随手练——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。

  • 相关阅读:
    构造函数+this关键字+super关键字
    封装
    数组+方法
    流程控制语句
    java运算符+引用数据类型
    java的基础安装
    mysql数据库连接
    mysql数据库约束
    mysql数据库
    练习010:按奇偶排序数组
  • 原文地址:https://www.cnblogs.com/czc1999/p/10355905.html
Copyright © 2011-2022 走看看