LEETCODE:飞地的数量(广度优先遍历)

Posted JGH个人号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LEETCODE:飞地的数量(广度优先遍历)相关的知识,希望对你有一定的参考价值。

先看题目

思路很简单,对每个岛做广度优先遍历,看能不能到边界.

LEETCODE:飞地的数量(广度优先遍历)

先做数据有效性判断,然后定义isvisit保存每个单元是否被访问过.

重点来了:

二维vector的初始化!!!

因为二维初始化必须先确定一个维度的长度,所以不能直接vector<vector<>> vec;

vector确定维度的初始化方式为:vector<...> v(5,0).这是初始化为5个0元素的vector

那么二维就可以这样初始化:vector<vector<int>> v(5,vector<int>(5,0))

每个二维vector有5个元素,每个元素都是一个初始化为5个0组成的vector.

定义完之后做遍历.只要是1且还没访问过的都做遍历.事先判断当前的1在不在边界上的意义不大,因为要是里面有1的话也是要遍历的.如果没有,那遍历也和没遍历差不多.而且事先判断还容易错.代码讲究思路的统一性,这一部分应当只负责检测1并进入遍历.至于效率可以之后再重构.


遍历函数里,num记录1的个数,mark记录是否有1在边界.

重点又来了!!!

x作为第一个下标,对应的是纵向,范围是[0,A.size()-1],而不是[0,A[0].size()-1],同时也别忘了减1!!!

还有一点,不能一判断是边界,就返回num为0,因为里面还没有遍历完.如果遇到边界就返回num为0,并把这个边界赋值为已访问,里面的就会被算为不能到达边界的.

最后上下左右细心点计算注意范围:x是第一维,对应A;y是第二维对应A[0];范围是[0,size-1].

最后,重复一遍思路:

result初始化为0.遍历整个地图,一旦遇到没访问过的1,从这个1开始广度遍历,并记录这个岛的面积num,访问情况和是否有边界,如果有边界,这个岛记为0,否则记为num.result与num累加的最后结果就是答案.


以上是关于LEETCODE:飞地的数量(广度优先遍历)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-200 深度优先+广度优先 岛屿数量

LeetCode 1129颜色交替的最短路径广度优先HERODING的LeetCode之路

leetcode 322. 零钱兑换

11道精选经典LeetCode例题让你彻底搞懂二叉树的广度优先遍历

LeetCode 力扣官方题解 - 1020. 飞地的数量

Leetcode-1031 Number of Enclaves(飞地的数量)