题目描述
思路解析动画文字版
记住这个反向:正向「水往低走」== 反向「从海边往高爬」。
先爬太平洋:起点是上边一整行 + 左边一整列(这些格紧挨太平洋)。
太平洋爬到 (4,0)高度5,标记可达。接着看它四周更高(≥5)的邻居。
太平洋爬到 (3,0)高度6,标记可达。接着看它四周更高(≥6)的邻居。
太平洋爬到 (3,1)高度7,标记可达。接着看它四周更高(≥7)的邻居。
太平洋爬到 (2,0)高度2,标记可达。接着看它四周更高(≥2)的邻居。
太平洋爬到 (1,0)高度3,标记可达。接着看它四周更高(≥3)的邻居。
太平洋爬到 (2,1)高度4,标记可达。接着看它四周更高(≥4)的邻居。
太平洋爬到 (2,2)高度5,标记可达。接着看它四周更高(≥5)的邻居。
太平洋爬到 (0,0)高度1,标记可达。接着看它四周更高(≥1)的邻居。
太平洋爬到 (0,1)高度2,标记可达。接着看它四周更高(≥2)的邻居。
太平洋爬到 (1,1)高度2,标记可达。接着看它四周更高(≥2)的邻居。
太平洋爬到 (1,2)高度3,标记可达。接着看它四周更高(≥3)的邻居。
太平洋爬到 (1,3)高度4,标记可达。接着看它四周更高(≥4)的邻居。
太平洋爬到 (1,4)高度4,标记可达。接着看它四周更高(≥4)的邻居。
太平洋爬到 (0,4)高度5,标记可达。接着看它四周更高(≥5)的邻居。
太平洋爬到 (0,2)高度2,标记可达。接着看它四周更高(≥2)的邻居。
太平洋爬到 (0,3)高度3,标记可达。接着看它四周更高(≥3)的邻居。
太平洋可达的格已标出(共16个)。现在反过来爬大西洋:起点是下边一整行 + 右边一整列。
大西洋爬到 (4,4)高度4,标记可达。接着看它四周更高(≥4)的邻居。
大西洋爬到 (3,4)高度5,标记可达。接着看它四周更高(≥5)的邻居。
大西洋爬到 (2,4)高度1,标记可达。接着看它四周更高(≥1)的邻居。
大西洋爬到 (1,4)高度4,标记可达。接着看它四周更高(≥4)的邻居。
大西洋爬到 (0,4)高度5,标记可达。接着看它四周更高(≥5)的邻居。
大西洋爬到 (1,3)高度4,标记可达。接着看它四周更高(≥4)的邻居。
大西洋爬到 (2,3)高度3,标记可达。接着看它四周更高(≥3)的邻居。
大西洋爬到 (3,3)高度4,标记可达。接着看它四周更高(≥4)的邻居。
大西洋爬到 (2,2)高度5,标记可达。接着看它四周更高(≥5)的邻居。
大西洋爬到 (4,3)高度2,标记可达。接着看它四周更高(≥2)的邻居。
大西洋爬到 (4,2)高度1,标记可达。接着看它四周更高(≥1)的邻居。
大西洋爬到 (3,2)高度1,标记可达。接着看它四周更高(≥1)的邻居。
大西洋爬到 (3,1)高度7,标记可达。接着看它四周更高(≥7)的邻居。
大西洋爬到 (4,1)高度1,标记可达。接着看它四周更高(≥1)的邻居。
大西洋爬到 (4,0)高度5,标记可达。接着看它四周更高(≥5)的邻居。
大西洋爬到 (3,0)高度6,标记可达。接着看它四周更高(≥6)的邻居。
两遍爬完。橘=太平洋可达,蓝灰=大西洋可达。重叠的格(两边都标过)就是答案,逐个点亮。
(0,4)高度5:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(1,3)高度4:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(1,4)高度4:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(2,2)高度5:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(3,0)高度6:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(3,1)高度7:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
(4,0)高度5:太平洋✓ 大西洋✓ → 点亮。它的水既能往左上流入太平洋,也能往右下流入大西洋。
边界先想清。
两个高频追问。
参考代码
def pacificAtlantic(h): R, C = len(h), len(h[0]) pac, atl = set(), set() def dfs(i, j, seen): seen.add((i, j)) for di, dj in ((1,0),(-1,0),(0,1),(0,-1)): ni, nj = i+di, j+dj if 0<=ni<R and 0<=nj<C and (ni,nj) not in seen \ and h[ni][nj] >= h[i][j]: dfs(ni, nj, seen) for i in range(R): dfs(i,0,pac); dfs(i,C-1,atl) for j in range(C): dfs(0,j,pac); dfs(R-1,j,atl) return [[i,j] for i in range(R) for j in range(C) if (i,j) in pac and (i,j) in atl]复杂度
- 时间:O(R·C),每格最多被各海访问一次
- 空间:O(R·C),两个可达标记矩阵 + 递归栈
易错点
面试追问把动画讲成自己的话
追问为什么不正向对每个格 DFS 看能否到海?
追问DFS 换成 BFS 行不行?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
被围绕的区域
LeetCode 130 · 中等 · 沿着 图 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题