解题步骤

  1. 新建两个矩阵、分别记录能流到两个大洋的坐标
  2. 从两个海岸线四个方向同时出发,进行深度优先遍历图,遍历过程中填充对应的两个矩阵
  3. 遍历矩阵,找出能同时流到两个大洋的坐标

LeetCode 417(太平洋大西洋流水问题) - 图1

LeetCode 417(太平洋大西洋流水问题) - 图2

LeetCode 417(太平洋大西洋流水问题) - 图3

通过图的方式进行实现

  • 时间复杂度:O (m * n)
  • 空间复杂度:O (m * n)

    1. function pacificAtlantic(heights) {
    2. const rows = heights.length;
    3. const cols = heights[0].length;
    4. const matrix1 = Array.from({ length: rows }, () => new Array(cols).fill(false));
    5. const matrix2 = Array.from({ length: rows }, () => new Array(cols).fill(false));
    6. const dfs = (row, col, matrix) => {
    7. matrix[row][col] = true;
    8. [
    9. [row - 1, col],
    10. [row + 1, col],
    11. [row, col - 1],
    12. [row, col + 1],
    13. ].forEach(([nRow, nCol]) => {
    14. const cond1 = nRow >= 0 && nRow < rows && nCol >= 0 && nCol < cols;
    15. const cond2 = cond1 ? !matrix[nRow][nCol] : false;
    16. const cond3 = cond2 ? heights[row][col] <= heights[nRow][nCol] : false;
    17. if (cond1 && cond2 && cond3) {
    18. dfs(nRow, nCol, matrix);
    19. }
    20. });
    21. };
    22. for (let i = 0; i < rows; i++) {
    23. dfs(i, 0, matrix1);
    24. dfs(i, cols - 1, matrix2);
    25. }
    26. for (let i = 0; i < cols; i++) {
    27. dfs(0, i, matrix1);
    28. dfs(rows - 1, i, matrix2);
    29. }
    30. const res = [];
    31. for (let row = 0; row < rows; row++) {
    32. for (let col = 0; col < cols; col++) {
    33. if (matrix1[row][col] && matrix2[row][col]) {
    34. res.push([row, col]);
    35. }
    36. }
    37. }
    38. return res;
    39. }

上方代码中无论 for 循环写的多么复杂,但是我们实际上只是遍历了矩阵的每一个元素,所以时间复杂度是 O (m n)m 代表是行的长度,n 是代表列的长度。代码中使用了两个矩阵,矩阵的大小是 m n 。所以我们按大的占用空间来算,空间复杂度是 O (m * n)