每日力扣-最短的桥

143 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。你可以将任意数量的 0 变为 1 ,以使两座岛连接起来,变成 一座岛 。返回必须翻转的 0 的最小数目。

分析

根据题目中的要求,我们可以很容易的得出要求返回的翻转二点最小数目,其实就是矩阵中两个岛的最短距离。求最短距离,无非是使用广度优先还是深度优先。本道题目我们使用广度优先算法进行处理。

我们首先定义一个岛屿,然后以它为中心,不断地向外扩展一圈,直到到达另外一个岛,延伸的圈数就是我们所要求得的最短距离。在这个过程中,我们可以将已经遍历过的位置标记为-1,那么我们的计算过程就如下:

  • 通过遍历数组,找到1的位置之后,进行广度优先搜索,那么我们就得到了第一座岛的位置集合。然后将其他位置标记为-1;
  • 将所有位置开始进行广度优先搜索,当它们达到了任意的1的时候,那就表示了搜索到了第二个岛屿,搜索到的层数就是最后的答案。

总结

一道比较困难的搜索题目。说实话,这道题目并没有什么研究的价值(特指面试的题目)。对于刚学习算法的同学来说,这道题目太过难了,如果你想学习广度 or 深度优先算法的题目的话,我的建议是从最简单的题目入手,这种难度的题目,并不能提高你的算法能力。

解题证明

image.png