417问题,能通过自己的测试用例,但是LeetCode上超时了
来源:8-7 floodfill算法,一类经典问题 Number of Islands-
慕工程2559728
2018-08-15
class Solution {
boolean[][] visited;
int m;
int n;
int[][] move = {{1,0},{0,1},{-1,0},{0,-1}};
Set<Character> set;
public boolean inarea(int i ,int j){
return i>=0 && j>=0 && i<m && j<n;
}
public List<int[]> pacificAtlantic(int[][] matrix) {
List<int[]> res = new ArrayList<>();
m = matrix.length;
if(m==0)
return res;
n = matrix[0].length;
set = new HashSet<>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
visited = new boolean[m][n];
if(!set.isEmpty())
set.clear();
if(dfs(i,j,matrix)){
int[] t = new int[2];
t[0] = i;
t[1] = j;
res.add(t);
}
}
}
return res;
}
private boolean dfs(int x , int y ,int[][] array){
visited[x][y] = true;
if(x == 0 || y == 0)
set.add('P');
if(x == m-1 || y == n-1)
set.add('A');
if(set.contains('P') && set.contains('A'))
return true;
for(int i=0;i<4;i++){
int newx = x + move[i][0];
int newy = y + move[i][1];
if(inarea(newx,newy) && !visited[newx][newy] && array[x][y] >= array[newx][newy]){
if(dfs(newx,newy,array))
return true;
}
}
return false;
}
}写回答
1回答
-
在你的17,18行的双重for循环中,每次相当于只通过dfs判断一个位置是否可行。整体算法复杂度是O(m*n*m*n)的:双重for循环m*n,每次dfs是O(m*n)。但是,其实可以通过预处理的方式,让时间复杂度变为O(m*n)的:)
大体思路:首先判断每个位置是否可以流入太平洋和以及是否可以流入大西洋(这个过程是O(m*n)),最后一次遍历来看每个点是否是问题想要的答案,这个过程也是O(m*n)的:)
加油!:)
012018-08-23
相似问题