給定乙個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。「太平洋」處於大陸的左邊界和上邊界,而「大西洋」處於大陸的右邊界和下邊界。
規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。
請找出那些水流既可以流動到「太平洋」,又能流動到「大西洋」的陸地單元的座標。
目前刷題存在的問題:
格式問題,缺:,()…
習慣性除錯…
邊界問題!!
特殊情況考慮,/[1]/…
本題的難點在採用逆向思維,從邊界開始dfs比較簡單。
class
solution
:# 邊界條件是最重要的!! >=0 def
pacificatlantic
(self, matrix: list[list[
int]])
-> list[list[
int]]:
ifnot matrix:
return
ocean1 =
ocean2 =
defdfs
(ocean, stack, i, j)
: m, n = i, j
ocean[
(i, j)]=
1if m +
1<
len(matrix)
and matrix[m +1]
[n]>= matrix[m]
[n]and
(m +
1, n)
notin ocean:
dfs(ocean, stack, m +
1, n)
if m -
1>=
0and matrix[m -1]
[n]>= matrix[m]
[n]and
(m -
1, n)
notin ocean:
dfs(ocean, stack, m -
1, n)
if n +
1<
len(matrix[0]
)and matrix[m]
[n +1]
>= matrix[m]
[n]and
(m, n +1)
notin ocean:
dfs(ocean, stack, m, n +1)
if n -
1>=
0and matrix[m]
[n -1]
>= matrix[m]
[n]and
(m, n -1)
notin ocean:
dfs(ocean, stack, m, n -1)
for i in
range
(len
(matrix)):
stack =
dfs(ocean1, stack, i,0)
dfs(ocean2, stack, i,
len(matrix[0]
)-1)
for i in
range
(len
(matrix[0]
)): stack =
dfs(ocean1, stack,
0, i)
dfs(ocean2, stack,
len(matrix)-1
, i)
out =
for i in ocean1:
if i in ocean2:
m, n = i
[m, n]
)return out
dfs模版區別比對:
正確:其實不需要把stack pop得到最後乙個的操作。因為此時用的是遞迴。只有單純for迴圈需要。
def
dfs(ocean, stack, i, j)
: m, n = i, j
ocean[
(i, j)]=
1if m +
1<
len(matrix)
and matrix[m +1]
[n]>= matrix[m]
[n]and
(m +
1, n)
notin ocean:
dfs(ocean, stack, m +
1, n)
if m -
1>=
0and matrix[m -1]
[n]>= matrix[m]
[n]and
(m -
1, n)
notin ocean:
dfs(ocean, stack, m -
1, n)
if n +
1<
len(matrix[0]
)and matrix[m]
[n +1]
>= matrix[m]
[n]and
(m, n +1)
notin ocean:
dfs(ocean, stack, m, n +1)
if n -
1>=
0and matrix[m]
[n -1]
>= matrix[m]
[n]and
(m, n -1)
notin ocean:
dfs(ocean, stack, m, n -
1)
def
dfs(ocean, stack, i, j)
:[i, j]
) ocean[
(i, j)]=
1while stack:
m, n = stack[-1
] ocean[
(m, n)]=
1if m +
1<
len(matrix)
and matrix[m +1]
[n]>= matrix[m]
[n]and
(m +
1, n)
notin ocean:
[m+1
, n]
)# ocean[(m+1, n)] = 1
elif m -
1>=
0and matrix[m -1]
[n]>= matrix[m]
[n]and
(m -
1, n)
notin ocean:
[m -
1, n]
)# ocean[(m-1, n)] = 1
elif n +
1<
len(matrix[0]
)and matrix[m]
[n +1]
>= matrix[m]
[n]and
(m, n +1)
notin ocean:
[m, n+1]
)# ocean[(m, n+1)] = 1
elif n -
1>=
0and matrix[m]
[n -1]
>= matrix[m]
[n]and
(m, n -1)
notin ocean:
[m, n-1]
)# ocean[(m, n - 1)] = 1
else
: stack.pop(
)
有缺陷:
if not stack:#必須加上if not stack
stack.pop()
def
dfs(ocean, stack, i, j)
: ocean[
(i, j)]=
1 m, n= stack[-1
]while stack:
if m +
1<
len(matrix)
and matrix[m +1]
[n]>= matrix[m]
[n]and
(m +
1, n)
notin ocean:
dfs(ocean, stack, m +
1, n)
if m -
1>=
0and matrix[m -1]
[n]>= matrix[m]
[n]and
(m -
1, n)
notin ocean:
dfs(ocean, stack, m -
1, n)
if n +
1<
len(matrix[0]
)and matrix[m]
[n +1]
>= matrix[m]
[n]and
(m, n +1)
notin ocean:
dfs(ocean, stack, m, n +1)
if n -
1>=
0and matrix[m]
[n -1]
>= matrix[m]
[n]and
(m, n -1)
notin ocean:
dfs(ocean, stack, m, n -1)
ifnot stack:
stack.pop(
)
417太平洋大西洋水流問題
採用逆向思維,從陣列的最外邊開始遍歷,向陣列中心開始遍歷,如果太平洋和大西洋都被訪問過,那麼當前節點就就符合題目條件。class solution,bool iseffective int x,int y void dfs int x,int y,int pre,vector bool shuzu,...
417 太平洋大西洋水流問題
典型的搜尋演算法,不過這次搜尋的目標有兩個,到達太平洋和大西洋。需要寫兩個dfs遞迴函式。演算法流程 遍歷圖中所有點,呼叫深度遞迴函式。如果該點既能到達太平洋又能夠到達大西洋。那麼將這個點加入結果集。返回結果集合 這裡的遞迴算是深度優先遍歷的模板步驟吧。不過這裡標記是否訪問用了乙個小技巧,修改原陣列...
417 太平洋大西洋水流問題 Medium
三 總結 給定乙個m x n的非負整數矩陣來表示一片大陸上各個單元格的高度。太平洋 處於大陸的左邊界和上邊界,而 大西洋 處於大陸的右邊界和下邊界。規定水流只能按照上 下 左 右四個方向流動,且只能從高到低或者在同等高度上流動。請找出那些水流既可以流動到 太平洋 又能流動到 大西洋 的陸地單元的座標...