Leetcode - Walls and Gates

My code:

public class Solution {
    private int row = 0;
    private int col = 0;
    private int[][] dir = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    private class Pair {
        int x;
        int y;
        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    public void wallsAndGates(int[][] rooms) {
        if (rooms == null || rooms.length == 0 || rooms[0].length == 0) {
            return;
        }
        this.row = rooms.length;
        this.col = rooms[0].length;
        Queue<Pair> q = new LinkedList<Pair>();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (rooms[i][j] == 0) {
                    q.offer(new Pair(i, j));
                }
            }
        }
        
        while (!q.isEmpty()) {
            Pair curr = q.poll();
            int curr_x = curr.x;
            int curr_y = curr.y;
            for (int k = 0; k < 4; k++) {
                int x = curr_x + dir[k][0];
                int y = curr_y + dir[k][1];
                if (check(x, y) && rooms[x][y] == Integer.MAX_VALUE) {
                    rooms[x][y] = 1 + rooms[curr_x][curr_y];
                    q.offer(new Pair(x, y));
                }
            }
        }
    }
    
    private boolean check(int i, int j) {
        if (i < 0 || i >= row || j < 0 || j >= col) {
            return false;
        }
        return true;
    }
}

一开始拿 DFS来做,发现 stack overflow.可能这道题目对stack要求比较严格。
然后拿BFS做,再次超时。。。
然后我才发现,原来我的BFS效率很低,是
Naive BFS

然后我自己写出了现在的 AC解法,论坛里别人称之为:
Multi-End BFS
为什么这么叫呢?我有自己的理解。
一般性的BFS,都是从一个点,一个end开始,BFS,一步步扩大。
但是这个里面,一开始队列里面有多个点,多个end

所以称作: Multi-End BFS

perfect

适用情况:
一定是,在外围,向内部渗透的时候,可以用到这种BFS
Surrounded Regions 也是如此。

然后Naive BFS 就不展示了。之前几道题目,BFS都超时。。
原来就是因为用了 naive bfs

dietpepsi 这篇文章写得挺不错的。
分析了

MultiEnd BFS,
Naive BFS,
DFS

reference:
https://discuss.leetcode.com/topic/35242/benchmarks-of-dfs-and-bfs

Anyway, Good luck, Richardo!

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/e72997d7becf#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞