leetcode417超时了

来源:8-7 floodfill算法,一类经典问题 Number of Islands-

蓝胖子的编程梦

2018-06-01

//超时了,怎么办老师??

private int m, n;      //数组的高度和宽度
private int[][] d = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
private boolean[][] used;
private boolean[][] pacific;   //能够流到太平洋的点标记为true
private boolean[][] atlantic; //能够流到大西洋的点标记为true
private List<int[]> res = new ArrayList<>();

public List<int[]> pacificAtlantic(int[][] matrix) {
    m = matrix.length;
    if (matrix.length == 0)
        return res;
    n = matrix[0].length;
    used = new boolean[m][n];
    pacific = new boolean[m][n];
    atlantic = new boolean[m][n];
    for (int i = 0; i < n; i++) {
        dfs(0, i, matrix);
        dfs2(m - 1, i, matrix);
    }
    for (int i = 0; i < m; i++) {
        dfs(i, 0, matrix);
        dfs2(i, n - 1, matrix);
    }
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++) {
            if (pacific[i][j])
                if (atlantic[i][j])
                    res.add(new int[]{i, j});
        }
    return res;
}

//从x,y(属于太平洋)边界开始搜索
private void dfs(int x, int y, int[][] matrix) {
    if (pacific[x][y] && atlantic[x][y])
        return;
    if (!used[x][y]) {
        used[x][y] = true;
        pacific[x][y] = true;
        for (int i = 0; i < 4; i++) {
            int newx = x + d[i][0];
            int newy = y + d[i][1];
            if (isArea(newx, newy) && !used[newx][newy] && matrix[newx][newy] >= matrix[x][y])
                dfs(newx, newy, matrix);
        }
        used[x][y] = false;
    }
}

//从x,y(属于太西洋)边界开始搜索
private void dfs2(int x, int y, int[][] matrix) {
    if (pacific[x][y] && atlantic[x][y])
        return;
    if (!used[x][y]) {
        used[x][y] = true;
        atlantic[x][y] = true;
        for (int i = 0; i < 4; i++) {
            int newx = x + d[i][0];
            int newy = y + d[i][1];
            if (isArea(newx, newy) && !used[newx][newy] && matrix[newx][newy] >= matrix[x][y])
                dfs2(newx, newy, matrix);
        }
        used[x][y] = false;
    }
}

//判断x,y是否越界
private boolean isArea(int x, int y) {
    return x >= 0 && x < m && y >= 0 && y < n;
}


写回答

1回答

liuyubobobo

2018-06-01

思路很好,只是在dfs的过程中没必要回溯。used[x][y]其实不需要在dfs的过程中重新置位。对于一个位置,如果在dfs的过程中已经判断过他可以到达太平洋或者大西洋,下次搜索到同样的位置就不需要再去搜索了:)


可以用一个小数据样本跟踪一下自己的程序,你就会明白你的程序重复搜索了多少东西。注意:对于你现在的程序,即使样例中的5*5的测试数据,也比较大。使用3*3或者4*4的测试数据,应该已经能看出问题了:)


我对这个问题的参考代码,可以参见这里:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0417-Pacific-Atlantic-Water-Flow/java-0417/src/Solution.java


加油!:)

0
1
蓝胖子的编程梦
非常感谢!
2018-06-01
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程