417 太平洋大西洋水流問題

2021-10-10 17:34:11 字數 4792 閱讀 5716

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