大岛的数量-LintCode

给一个布尔类型的二维数组, 0 表示海, 1 表示岛。如果两个1是相邻的,那么我们认为他们是同一个岛.我们只考虑 上下左右 相邻.
找到大小在 k 及 k 以上的岛屿的数量

样例:
给一个二维数组:

[
  [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]
]

给出 K = 2
返回 2

思路:
DFS,递归,求出每个大岛的数目。使用额外的空间会报错,
故在grid上直接判断,修改。

#ifndef C677_H
#define C677_H
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
    /*
    * @param : a 2d boolean array
    * @param : an integer
    * @return: the number of Islands
    */
    int numsofIsland(vector<vector<bool>> grid, int k) {
        // Write your code here
        if (grid.empty()||grid[0].empty())
            return 0;
        int num = 0;
        int row = grid.size();
        int col = grid[0].size();
        vector<vector<int>> dic{ { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };//为了方便计算上下左右四个位置    
        for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                if (grid[i][j])
                {
                    int cnt = helper(grid, i, j, dic);
                    if (cnt>0 && cnt >= k)
                        num++;
                }
            }
        }
        return num;
    }
    //对于grid[i][j],若grid[i][j]==1,为防止重复计算,更改其值为false,
    //并递归求出与grid[i][j]相邻的满足条件的点,计算其个数
    int helper(vector<vector<bool>> &grid, int i, int j,vector<vector<int>> dic)
    {
        int row = grid.size();
        int col = grid[0].size();
        int num = 0;
        if (i < 0 || j < 0 || i >= row || j >= col)
            return 0;
        int pos = i*col + j;
        if (grid[i][j])
        {
            num++;
            grid[i][j]=false;
            for (auto c : dic)
            {
                int x = i + c[0];
                int y = j + c[1];
                num+=helper(grid, x, y, dic);
            }
            return num;
        }
        else
            return 0;
    }
};
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值