/
githubmirror
/
interviews
Обзор
Документация
Войти
/
githubmirror
/
interviews
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
leetcode/breadth-first-search/PacificAtlanticWaterFlow.java
78 строк
3 KB
Kevin Naughton Jr
finish renaming files and directories
27 мар 2018, 19:52
27 мар 2018, 19:52
ec6dfb5
Код
Авторство
О чём код?
// Given an m x n matrix of non-negative integers representing the height of each unit cell in a continent, the "Pacific ocean" touches the left and top edges of the matrix and the "Atlantic ocean" touches the right and bottom edges. // Water can only flow in four directions (up, down, left, or right) from a cell to another one with height equal or lower. // Find the list of grid coordinates where water can flow to both the Pacific and Atlantic ocean. // Note: // The order of returned grid coordinates does not matter. // Both m and n are less than 150. // Example: // Given the following 5x5 matrix: // Pacific ~ ~ ~ ~ ~ // ~ 1 2 2 3 (5) * // ~ 3 2 3 (4) (4) * // ~ 2 4 (5) 3 1 * // ~ (6) (7) 1 4 5 * // ~ (5) 1 1 2 4 * // * * * * * Atlantic // Return: // [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (positions with parentheses in above matrix). public class PacificAtlanticWaterFlow { public List<int[]> pacificAtlantic(int[][] matrix) { List<int[]> result = new LinkedList<>(); //error checking if(matrix == null || matrix.length == 0 || matrix[0].length == 0) { return result; } int n = matrix.length; int m = matrix[0].length; boolean[][] pacific = new boolean[n][m]; boolean[][] atlantic = new boolean[n][m]; for(int i = 0; i < n; i++) { dfs(matrix, pacific, Integer.MIN_VALUE, i, 0); dfs(matrix, atlantic, Integer.MIN_VALUE, i, m - 1); } for(int i = 0; i < m; i++) { dfs(matrix, pacific, Integer.MIN_VALUE, 0, i); dfs(matrix, atlantic, Integer.MIN_VALUE, n - 1, i); } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(pacific[i][j] && atlantic[i][j]) { result.add(new int[] {i, j}); } } } return result; } public void dfs(int[][] matrix, boolean[][] visited, int height, int x, int y) { int n = matrix.length; int m = matrix[0].length; if(x < 0 || x >= n || y < 0 || y >= m || visited[x][y] || matrix[x][y] < height) { return; } visited[x][y] = true; dfs(matrix, visited, matrix[x][y], x + 1, y); dfs(matrix, visited, matrix[x][y], x - 1, y); dfs(matrix, visited, matrix[x][y], x, y + 1); dfs(matrix, visited, matrix[x][y], x, y - 1); } }