1. 問題描述:
你有乙個用於表示一片土地的整數矩陣land,該矩陣中每個點的值代表對應地點的海拔高度。若值為0則表示水域。由垂直、水平或對角連線的水域為池塘。池塘的大小是指相連線的水域的個數。編寫乙個方法來計算矩陣中所有池塘的大小,返回值需要從小到大排序。
示例:
輸入:[[0,2,1,0],
[0,1,0,1],
[1,1,0,1],
[0,1,0,1]
]輸出: [1,2,4]
2. 思路分析:
① 從題目中可以知道我們需要找出矩陣中的每一片聯通的水域的個數(注意矩陣中值為0的地方為水域),所以這是一道典型的關於連通性的問題,對於這種連通性的問題經典的做法是dfs搜尋,使用dfs搜尋從起點出發能夠到達的所有水域,一次dfs結束表示的是從一開始的那個起點能夠到達的地方都搜尋過了,所以我們可以遍歷二維矩陣,找出值為0的起點,然後從這個起點出發使用dfs搜尋所有能夠到達的點,並且在搜尋的時候使用乙個全域性變數來進行計數,一次dfs結束那麼就將全域性變數的值加入到結果集中(表明乙個水域的結束),因為是二維矩陣的搜尋,所以我們需要標記一下訪問過的點,這樣才不會導致對於已經訪問過的點重新訪問了,對於這道題目來說可以使用將矩陣中已經訪問過的點標記為1即可,下一次就不會再訪問了
② 對於搜尋當前的起點能夠到達的區域,我們可以使用乙個二維列表來表示八個不同的方向,這樣我們就可以在迴圈中依次嘗試當前的點能夠到達八個方向的哪些點,然後再遞迴下去
3. **如下:
from typing import list
class solution:
count = 0
def dfs(self, land: list[list[int]], x: int, y: int, r: int, c: int, pos: list[list]):
land[x][y] = 1
self.count += 1
# 搜尋八個平行方向
for i in range(8):
x1, y1 = x + pos[i][0], y + pos[i][1]
if 0 <= x1 < r and 0 <= y1 < c and land[x1][y1] == 0:
self.dfs(land, x1, y1, r, c, pos)
def pondsizes(self, land: list[list[int]]) -> list[int]:
pos = [[-1, 0], [1, 0], [0, -1], [0, 1], [-1, -1], [1, -1], [-1, 1], [1, 1]]
res = list()
for i in range(len(land)):
for j in range(len(land[0])):
if land[i][j] == 0:
self.dfs(land, i, j, len(land), len(land[0]), pos)
self.count = 0
return sorted(res)
面試題 16 19 水域大小
你有乙個用於表示一片土地的整數矩陣land,該矩陣中每個點的值代表對應地點的海拔高度。若值為0則表示水域。由垂直 水平或對角連線的水域為池塘。池塘的大小是指相連線的水域的個數。編寫乙個方法來計算矩陣中所有池塘的大小,返回值需要從小到大排序。示例 0 len land 1000 0 len land ...
LeetCode面試題 16 19 水域大小
面試題 16.19.水域大小 難度中等25收藏分享切換為英文關注反饋 你有乙個用於表示一片土地的整數矩陣land,該矩陣中每個點的值代表對應地點的海拔高度。若值為0則表示水域。由垂直 水平或對角連線的水域為池塘。池塘的大小是指相連線的水域的個數。編寫乙個方法來計算矩陣中所有池塘的大小,返回值需要從小...
LeetCode 面試題 16 19 水域大小
面試題 16.19.水域大小 難度中等40 你有乙個用於表示一片土地的整數矩陣land,該矩陣中每個點的值代表對應地點的海拔高度。若值為0則表示水域。由垂直 水平或對角連線的水域為池塘。池塘的大小是指相連線的水域的個數。編寫乙個方法來計算矩陣中所有池塘的大小,返回值需要從小到大排序。示例 輸入 0,...