Skip to content

Commit 0c75b58

Browse files
committed
[LeetCode Sync] Runtime - 27 ms (83.25%), Memory - 19.2 MB (79.71%)
1 parent 31ce213 commit 0c75b58

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<p>There is an <code>m x n</code> rectangular island that borders both the <strong>Pacific Ocean</strong> and <strong>Atlantic Ocean</strong>. The <strong>Pacific Ocean</strong> touches the island&#39;s left and top edges, and the <strong>Atlantic Ocean</strong> touches the island&#39;s right and bottom edges.</p>
2+
3+
<p>The island is partitioned into a grid of square cells. You are given an <code>m x n</code> integer matrix <code>heights</code> where <code>heights[r][c]</code> represents the <strong>height above sea level</strong> of the cell at coordinate <code>(r, c)</code>.</p>
4+
5+
<p>The island receives a lot of rain, and the rain water can flow to neighboring cells directly north, south, east, and west if the neighboring cell&#39;s height is <strong>less than or equal to</strong> the current cell&#39;s height. Water can flow from any cell adjacent to an ocean into the ocean.</p>
6+
7+
<p>Return <em>a <strong>2D list</strong> of grid coordinates </em><code>result</code><em> where </em><code>result[i] = [r<sub>i</sub>, c<sub>i</sub>]</code><em> denotes that rain water can flow from cell </em><code>(r<sub>i</sub>, c<sub>i</sub>)</code><em> to <strong>both</strong> the Pacific and Atlantic oceans</em>.</p>
8+
9+
<p>&nbsp;</p>
10+
<p><strong class="example">Example 1:</strong></p>
11+
<img alt="" src="https://assets.leetcode.com/uploads/2021/06/08/waterflow-grid.jpg" style="width: 400px; height: 400px;" />
12+
<pre>
13+
<strong>Input:</strong> heights = [[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]]
14+
<strong>Output:</strong> [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
15+
<strong>Explanation:</strong> The following cells can flow to the Pacific and Atlantic oceans, as shown below:
16+
[0,4]: [0,4] -&gt; Pacific Ocean
17+
&nbsp; [0,4] -&gt; Atlantic Ocean
18+
[1,3]: [1,3] -&gt; [0,3] -&gt; Pacific Ocean
19+
&nbsp; [1,3] -&gt; [1,4] -&gt; Atlantic Ocean
20+
[1,4]: [1,4] -&gt; [1,3] -&gt; [0,3] -&gt; Pacific Ocean
21+
&nbsp; [1,4] -&gt; Atlantic Ocean
22+
[2,2]: [2,2] -&gt; [1,2] -&gt; [0,2] -&gt; Pacific Ocean
23+
&nbsp; [2,2] -&gt; [2,3] -&gt; [2,4] -&gt; Atlantic Ocean
24+
[3,0]: [3,0] -&gt; Pacific Ocean
25+
&nbsp; [3,0] -&gt; [4,0] -&gt; Atlantic Ocean
26+
[3,1]: [3,1] -&gt; [3,0] -&gt; Pacific Ocean
27+
&nbsp; [3,1] -&gt; [4,1] -&gt; Atlantic Ocean
28+
[4,0]: [4,0] -&gt; Pacific Ocean
29+
[4,0] -&gt; Atlantic Ocean
30+
Note that there are other possible paths for these cells to flow to the Pacific and Atlantic oceans.
31+
</pre>
32+
33+
<p><strong class="example">Example 2:</strong></p>
34+
35+
<pre>
36+
<strong>Input:</strong> heights = [[1]]
37+
<strong>Output:</strong> [[0,0]]
38+
<strong>Explanation:</strong> The water can flow from the only cell to the Pacific and Atlantic oceans.
39+
</pre>
40+
41+
<p>&nbsp;</p>
42+
<p><strong>Constraints:</strong></p>
43+
44+
<ul>
45+
<li><code>m == heights.length</code></li>
46+
<li><code>n == heights[r].length</code></li>
47+
<li><code>1 &lt;= m, n &lt;= 200</code></li>
48+
<li><code>0 &lt;= heights[r][c] &lt;= 10<sup>5</sup></code></li>
49+
</ul>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution:
2+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
3+
m, n = len(heights), len(heights[0])
4+
visited1 = [[False] * n for _ in range(m)]
5+
visited2 = [[False] * n for _ in range(m)]
6+
queue1: Deque[Tuple[int, int]] = deque()
7+
queue2: Deque[Tuple[int, int]] = deque()
8+
directions = (-1, 0, 1, 0, -1)
9+
10+
for i in range(m):
11+
queue1.append((i, 0))
12+
visited1[i][0] = True
13+
queue2.append((i, n - 1))
14+
visited2[i][n - 1] = True
15+
16+
for j in range(n):
17+
queue1.append((0, j))
18+
visited1[0][j] = True
19+
queue2.append((m - 1, j))
20+
visited2[m - 1][j] = True
21+
22+
def bfs(queue: Deque[Tuple[int, int]], visited: List[List[bool]]) -> None:
23+
while queue:
24+
x, y = queue.popleft()
25+
for dx, dy in pairwise(directions):
26+
nx, ny = x + dx, y + dy
27+
28+
if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny] and heights[nx][ny] >= heights[x][y]:
29+
visited[nx][ny] = True
30+
queue.append((nx, ny))
31+
32+
33+
bfs(queue1, visited1)
34+
bfs(queue2, visited2)
35+
36+
return [(i, j) for i in range(m) for j in range(n) if visited1[i][j] and visited2[i][j]]

0 commit comments

Comments
 (0)