【Leetcode】286. Walls and Gates

【Leetcode】286. Walls and Gates_第1张图片

1 其实就是求INF点到gate的最近曼哈顿距离

2 第一种方法是DFS:我们首先找到0的位置,每找到一个0,我们将其相邻四个位置做为起点做DFS遍历,并带上深度值1,如果遇到的值大于深度值,则将该深度值更新为当前深度值,然后再对当前点的四个相邻点开始DFS遍历,并且此时深度值需要加1,这样所有位置都被遍历完后,所有位置的深度值都被更新了

3 第二种方法是BFS:结合queue来做,我们把门的位置都放到queue中,对于每一个gate,我们判断其相邻四个点,判断坐标是否合法,判断其值是否大于上一位置值加1,如果是,则更新当前位置的值为上一位置值加1,并需要将此位置加入到queue中,这样遍历完所有queue后,所有值也就更新了

4 此题和number of islands有点相似,很容易想到用dfs,在number of islands里面,遇到1就调用dfs,此题中遇到0就调用dfs

5 设计dfs函数时,distance参数是一个很重要的参数,所有输入参数有grid,x, y,distance,如果原有的distance比现在要小,则stop,这里包括两种情况,一是遇到wall,二是表明当前INF隔另外一个门更近

6 这道题也可以说是求最短路径

7 BFS方法一般都要结合queue来做,把所有需要更新的点都放到queue中。每访问一个点,我们需要把可更新的(值大于当前距离的)压入队列中

8 BFS第一遍将所有gate加入到queue中,然后对于每一个gate,看它的上下左右有没有room,如果有,将room加到queue中去

9 最优的BFS写法是,先将所有gate加入到queue中,这样就保证了每一个gate只被遍历了一次,不会重复遍历,这样保证了时间复杂度是O(mn),其中m和n是grid的row和column

10 所以我们首先得到gate的位置,放到queue中,然后遍历queue中每一个位置,对于这个位置,我们考虑其上下左右位置的值,同时要判定上下左右的位置是否合法,和其值是否是INF,如果是,我们更新值为上一位置加1,同时将该元素压入到queue中

此处逗号是啥意思?逗号在这将tuple转换成list元素,然后再和前面的list相加

【Leetcode】286. Walls and Gates_第2张图片


【Leetcode】286. Walls and Gates_第3张图片


【Leetcode】286. Walls and Gates_第4张图片

1 第一个红框,写成0<=y+v

2 只有当当前值大于上一值+1时,我们才递归,从而更新;其他情况我们不需要更新,所以也不需要递归


【Leetcode】286. Walls and Gates_第5张图片

注意要更新rooms的值


【Leetcode】286. Walls and Gates_第6张图片

只有当四个方向的值大于当前位置的值的时候,才会调用dfs函数


【Leetcode】286. Walls and Gates_第7张图片

你可能感兴趣的:(【Leetcode】286. Walls and Gates)