LEETCODE:飞地的数量(广度优先遍历)
Posted JGH个人号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 1129颜色交替的最短路径广度优先HERODING的LeetCode之路