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
相似问题