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回答
-
思路很好,只是在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
加油!:)
012018-06-01
相似问题
Leetcode第447题算法超时
回答 1
关于leetcode417号问题
回答 1