为什么说超级实用? 因为我在之前机器学习的一个项目中做 MNIST 识别提取feature特征的时候,曾经实用了这个算法。 把数字的continous white space作为训练的依据。
我的第一反应是我们肯定得iterate array, 然后从iterate 的点 开始移动, 如果碰到的是一个1 代表还是一个island的部分, 我们number of islands总数量不增加。 如果碰到的是一个0, 这个时候该怎么做让我有点困惑。我们不可能直接停下来吧,因为右边为0,左边也许还有大把天地呢。 但是怎么判断什么时候这个island挖掘完毕了? 当四面都是0? 还有可能周围是边边不可能出现数字了。 想到这里,又是一脸懵逼。
然后我就开始用手指在图上画圈了。假设手指一直贴在上面开始走, 我先往右边碰到0开始往左再往下知道又碰到一堆0。 这个时候就应该停下?从另一个起始点为1的地方开始再比划比划。 但是,这么做的问题是原本和island 连在一起的地方怎么可以不算进去。我要是不小心又从某一个island里的1开始走,岂不是多算了island。
【回过头再看,原来我一开始做的时候卡住的点 真的是这道题最精华的地方: 如何判断一侧已经不是island了,当遇到一大排的0的时候。这个东西非常玄妙,正常的思维会是在最末一排,一个一个的数,比如最下面一排,第一个看看下面是不是0,是的话 换第二个看看下面是不是0, 是的话,看第三个。。。但是这个在代码上不是很好实现当给的input非常大的时候。
用DFS的方法如何实现? 这个真的是超级考能力,从island四面八方开始散开,当这条路碰到0,那么终止,另一条路碰到0,终止, 如果从起始地扩散过后全碰到0了,就代表我们已经发掘完这个island完整的地形了,再出去就是大海了。
还有一个非常考验能力的地方,我估计我第一次做应该想不到的就是可以去修改array里的东西。 我原本不是很担心多数的情况吗,毕竟如果我从island的某一个点开始四面八方开始跑,到了第二个点,他是可以往之前的点跑的,那就来回跑没完没了了。 所以最好的办法就是给去过的地方标注成为visited,也就是设置为0. 】
大概
应该是由于我以前做过好几次,所以虽然隔了很久竟然还是有这个直觉是这么写。 如果完全第一次的话,估计应该是没有什么头绪。