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回答

liuyubobobo

2018-08-15

在你的17,18行的双重for循环中,每次相当于只通过dfs判断一个位置是否可行。整体算法复杂度是O(m*n*m*n)的:双重for循环m*n,每次dfs是O(m*n)。但是,其实可以通过预处理的方式,让时间复杂度变为O(m*n)的:)


看看这个思路是否能看懂:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0417-Pacific-Atlantic-Water-Flow/java-0417/src/Solution.java


大体思路:首先判断每个位置是否可以流入太平洋和以及是否可以流入大西洋(这个过程是O(m*n)),最后一次遍历来看每个点是否是问题想要的答案,这个过程也是O(m*n)的:)


加油!:)

0
1
慕工程2559728
非常感谢!
2018-08-23
共1条回复

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

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

7408 学习 · 1150 问题

查看课程