|
| 1 | +/** |
| 2 | + * @param {number[][]} heights |
| 3 | + * @return {number[][]} |
| 4 | + */ |
| 5 | +var pacificAtlantic = function(heights) { |
| 6 | + const ROWS = heights.length; |
| 7 | + const COLS = heights[0].length; |
| 8 | + |
| 9 | + const pac = new Set(); |
| 10 | + const atl = new Set(); |
| 11 | + |
| 12 | + const dfs = (r, c, visit, prevHeight) => { |
| 13 | + const key = `${r},${c}`; |
| 14 | + if ( |
| 15 | + visit.has(key) || |
| 16 | + r < 0 || c < 0 || r >= ROWS || c >= COLS || |
| 17 | + heights[r][c] < prevHeight |
| 18 | + ) { |
| 19 | + return; |
| 20 | + } |
| 21 | + |
| 22 | + visit.add(key); |
| 23 | + |
| 24 | + dfs(r + 1, c, visit, heights[r][c]); |
| 25 | + dfs(r - 1, c, visit, heights[r][c]); |
| 26 | + dfs(r, c + 1, visit, heights[r][c]); |
| 27 | + dfs(r, c - 1, visit, heights[r][c]); |
| 28 | + }; |
| 29 | + |
| 30 | + for (let c = 0; c < COLS; c++) { |
| 31 | + dfs(0, c, pac, heights[0][c]); // Top row (Pacific) |
| 32 | + dfs(ROWS - 1, c, atl, heights[ROWS - 1][c]); // Bottom row (Atlantic) |
| 33 | + } |
| 34 | + |
| 35 | + for (let r = 0; r < ROWS; r++) { |
| 36 | + dfs(r, 0, pac, heights[r][0]); // Left col (Pacific) |
| 37 | + dfs(r, COLS - 1, atl, heights[r][COLS - 1]); // Right col (Atlantic) |
| 38 | + } |
| 39 | + |
| 40 | + const res = []; |
| 41 | + for (let r = 0; r < ROWS; r++) { |
| 42 | + for (let c = 0; c < COLS; c++) { |
| 43 | + const key = `${r},${c}`; |
| 44 | + if (pac.has(key) && atl.has(key)) { |
| 45 | + res.push([r, c]); |
| 46 | + } |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + return res; |
| 51 | +}; |
0 commit comments