力扣(LeetCode)417
題目地址:
https://leetcode-cn.com/probl...
題目描述:
給定一個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。“太平洋”處於大陸的左邊界和上邊界,而“大西洋”處於大陸的右邊界和下邊界。
規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。
請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標。
解答:
反向思維,某個地方可以流向大西洋或太平洋,我們把它理解為太平洋或者大西洋可以流向某個區域,這樣一來只需要從大西洋或者太平樣的節點進行深度優先搜尋即可。只不過原來的流動條件是高往低流,現在變為低往高流。
java ac程式碼:
class Solution { boolean[][]left; boolean[][]right; boolean[][] flag1; boolean[][] flag2; public List<int[]> pacificAtlantic(int[][] matrix) { List<int[]> ans = new ArrayList(1000); if(matrix.length == 0)return ans; left = new boolean[matrix.length][matrix[0].length]; right = new boolean[matrix.length][matrix[0].length]; flag1 = new boolean[matrix.length][matrix[0].length]; flag2 = new boolean[matrix.length][matrix[0].length]; for(int i = 0;i < matrix.length;i++) { dfsleft(matrix,flag1,i,0); dfsright(matrix,flag2,i,matrix[0].length-1); } for(int i = 0;i < matrix[0].length;i++) { dfsleft(matrix,flag1,0,i); dfsright(matrix,flag2,matrix.length-1,i); } for(int i = 0;i < matrix.length;i++) for(int j = 0;j < matrix[0].length;j++) if(left[i][j] && right[i][j]) ans.add(new int[]{i,j}); return ans; } void dfsleft(int[][] matrix,boolean[][]flag,int x,int y) { if(flag[x][y])return; flag[x][y] = true; left[x][y] = true; if((x-1 >= 0 && x-1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x-1][y] >= matrix[x][y]) dfsleft(matrix,flag,x-1,y); if((x+1 >= 0 && x+1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x+1][y] >= matrix[x][y]) dfsleft(matrix,flag,x+1,y); if((x >= 0 && x < matrix.length && y-1 >= 0 && y-1< matrix[0].length) && matrix[x][y-1] >= matrix[x][y]) dfsleft(matrix,flag,x,y-1); if((x >= 0 && x < matrix.length && y+1 >= 0 && y+1< matrix[0].length) && matrix[x][y+1] >= matrix[x][y]) dfsleft(matrix,flag,x,y+1); } void dfsright(int[][] matrix,boolean[][]flag,int x,int y) { if(flag[x][y])return; flag[x][y] = true; right[x][y] = true; if((x-1 >= 0 && x-1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x-1][y] >= matrix[x][y]) dfsright(matrix,flag,x-1,y); if((x+1 >= 0 && x+1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x+1][y] >= matrix[x][y]) dfsright(matrix,flag,x+1,y); if((x >= 0 && x < matrix.length && y-1 >= 0 && y-1< matrix[0].length) && matrix[x][y-1] >= matrix[x][y]) dfsright(matrix,flag,x,y-1); if((x >= 0 && x < matrix.length && y+1 >= 0 && y+1< matrix[0].length) && matrix[x][y+1] >= matrix[x][y]) dfsright(matrix,flag,x,y+1); } }