leetcode刷题250天(62)——417. 太平洋大西洋水流问题(dfs)

这篇博客讨论了一种解决矩阵中水流路径问题的算法。给定一个表示岛屿高度的矩阵,算法通过深度优先搜索(DFS)检查每个单元格,从太平洋和大西洋的边界开始,寻找能够同时连接两者路径的点。如果找到这样的点,则说明存在水流可以从太平洋流到大西洋。算法通过维护两个visited矩阵记录已遍历的单元格,并检查边界点来实现这一目标。
摘要由CSDN通过智能技术生成

有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。
“太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

这个岛被分割成一个由若干方形单元格组成的网格。
给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。

岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,
雨水可以直接向北、南、东、西流向相邻单元格。
水可以从海洋附近的任何单元格流入海洋

解题思路:
给定一个矩阵,矩阵可以从大数向相同或小数方向移动。
问是否存在点能流到左侧上侧的同时流到右侧或者下侧。
既然最边上一圈可以分别流入相邻大洋。
那只需要分别 两个大洋 递归查询边界点,并记录 看两个记录矩阵是否重合
重合则说明存在这样一个点能够联通两个大洋

class Solution(object):
    def pacificAtlantic(self, heights):
        
        m = len(heights)
        n = len(heights[0])
        # 记录 visited 矩阵
        pac = [[0]*n for _ in range(m)]
        atl = [[0]*n for _ in range(m)]
        res = []

        def dfs(heights, visited, row, col):

            if visited[row][col]:
                return
            visited[row][col] = 1
			# 重合则说明存在这样一个点能够联通两个大洋
            if (pac[row][col] and atl[row][col]):
                res.append([row,col])
                
			# 越界条件 和 流动方向
            if row-1>=0 and heights[row-1][col]>=heights[row][col]:
                dfs(heights, visited, row-1, col)
            if row+1<m and heights[row+1][col]>=heights[row][col]:
                dfs(heights,visited, row+1, col)
            if col-1>=0 and heights[row][col-1]>=heights[row][col]:
                dfs(heights, visited, row, col-1)
            if col+1<n and heights[row][col+1]>=heights[row][col]:
                dfs(heights, visited, row, col+1)

            return
            
        # 分别 两个大洋 递归查询边界点
        for i in range(m):
            dfs(heights, pac, i, 0)
            dfs(heights, atl, i, n-1)

        for j in range(n):
            dfs(heights, pac, 0, j)
            dfs(heights, atl, m-1, j)
            
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值