leetcode 題目417 太平洋大西洋水流問題

2021-10-05 01:11:16 字數 2380 閱讀 1368

2020/3/27  打卡

給定乙個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。「太平洋」處於大陸的左邊界和上邊界,而「大西洋」處於大陸的右邊界和下邊界。

規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。

請找出那些水流既可以流動到「太平洋」,又能流動到「大西洋」的陸地單元的座標。

輸出座標的順序不重要

m 和 n 都小於150

示例:給定下面的 5x5 矩陣:

太平洋 ~ ~ ~ ~ ~

~ 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 *

* * * * * 大西洋

返回:[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上圖中帶括號的單元).

解釋: 為什麼這幾個點 可以流到兩個海洋中, 是因為比如(3,1)這個位置,其海拔高,因此 是可以自由的流向所有海拔低的位置,因此肯定滿足。

同理(1,3)位置既能流向低海拔的上面,也能流向同等海拔的右邊。

這種流向判別問題,其實最簡單的思路就是dfs,而且可以使用雙重dfs的思路,對每個位置點啟動dfs上的判別,這是最簡單的思路。

但是時間複雜度高。

改進下,使用有剪枝的dfs方式,從邊界往內流來啟動dfs,只在 海洋邊界上進行dfs操作,且使用 q_flag 和 a_flag 兩個標記標識 不同海洋的可流向性。

# 時間複雜度為o(m*n) 空間複雜度為o(m*n)

class solution:

def pacificatlantic(self, matrix):

""":type matrix: list[list[int]]

:rtype: list[list[int]]

"""if not matrix:

return

# 設定行走的四個方向。

step = [[-1, 0], [1, 0], [0, -1], [0, 1]]

res =

row = len(matrix)

col = len(matrix[0])

# 這裡分別 標記能流向大西洋 和 太平洋的可行性,flag為1表示能流過去。 這個是重點,之後會針對每個位置點都計算出兩個標記來。

q_flag = [[false] * col for _ in range(row)]

a_flag = [[false] * col for _ in range(row)]

# 接下來是dfs,從海洋邊界開始往內去 獲取每個位置點的兩種可流到性, 目標就是獲取實際的 q_flag 和 a_flag標記。

def dfs(i, j, visited):

visited[i][j] = true

for x, y in step:

# 先嘗試性的移動。

tmp_i, tmp_j = i + x, j + y

# 如果 可以繼續往內延伸時,進行延伸是不滿足流向條件時(不能往高處流,判別過的不再判別。),就結束掉,否則繼續往內延伸,

if tmp_i < 0 or tmp_j < 0 or tmp_i >= row or tmp_j >= col or matrix[tmp_i][tmp_j] < matrix[i][j] or visited[tmp_i][tmp_j]:

continue

dfs(tmp_i, tmp_j, visited)

# 這裡注意一定是從 從兩個海洋邊界向陸地搜尋,否則會超時 。 進行邊界往內的搜尋,並完成對內陸結點流向可能性,使用延伸的方法做標記。

for m in range(row):

# 分別做 大西洋和太平洋 流向可達性的判別。 分別嘗試往內流的延伸情況,注意 對於標記的獲取 是分別的,兩個河流分別判別。

dfs(m, 0, q_flag)

dfs(m, col - 1, a_flag)

for n in range(col):

dfs(0, n, q_flag)

dfs(row - 1, n, a_flag)

# 最後 是流向上的判別。

for i in range(row):

for j in range(col):

# 簡單的判別兩個海洋都能流到的,就是成功的目標位置。

if q_flag[i][j] and a_flag[i][j]:

return res

Leetcode417 太平洋大西洋水流問題

給定乙個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。太平洋 處於大陸的左邊界和上邊界,而 大西洋 處於大陸的右邊界和下邊界。規定水流只能按照上 下 左 右四個方向流動,且只能從高到低或者在同等高度上流動。請找出那些水流既可以流動到 太平洋 又能流動到 大西洋 的陸地單元的座標。輸出...

leetcode417 大西洋太平洋水流問題

給定乙個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。太平洋 處於大陸的左邊界和上邊界,而 大西洋 處於大陸的右邊界和下邊界。規定水流只能按照上 下 左 右四個方向流動,且只能從高到低或者在同等高度上流動。請找出那些水流既可以流動到 太平洋 又能流動到 大西洋 的陸地單元的座標。輸出...

leetCode 417 太平洋大西洋水流問題

給定乙個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。太平洋 處於大陸的左邊界和上邊界,而 大西洋 處於大陸的右邊界和下邊界。規定水流只能按照上 下 左 右四個方向流動,且只能從高到低或者在同等高度上流動。請找出那些水流既可以流動到 太平洋 又能流動到 大西洋 的陸地單元的座標。輸出...