200. Number of Islands
題目解釋:給出一個二維的數組,裏面只是包含字符‘0’和字符‘1’,其中字符‘0’代表水,字符‘1’代表島嶼。島嶼是被水所環繞同時也是被垂直或者水平方向的島嶼相連接。假設所有邊緣的部分都是被水所環繞
Example 1:
Input:
11110
11010
11000
00000
Output: 1
解釋:上面的所有的字符‘1’都是可以採用一條線連接起來的。所以最後輸出只有一個島嶼
Example 2:
Input:
11000
11000
00100
00011
Output: 3
解釋:最後的結果輸出3,因爲3個島嶼都不能採用同一條線連接起來。
題目分析:這道求島嶼數量的題的本質是求解矩陣中能夠相連的字符‘1’的個數,很容易想到需要用深度優先搜索 DFS 來解,,對於一個爲 ‘1’ 且未被訪問過的位置,我們遞歸進入其上下左右(四個方向)位置上爲 ‘1’ 的數,將‘1’標記爲已訪問,可以置爲‘0’,繼續進入其所有相連的鄰位置,這樣可以將這個連通區域所有的數找出來,並將其對應的 ‘1’中的值賦 ‘0’,找完相鄰區域後,我們將結果 res 自增1,然後我們在繼續找下一個爲 ‘1’ 且未被訪問過的位置,以此類推直至遍歷完整個原數組即可得到最終結果。
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
res=0
# 對每個是'1'的位置進行深度優先遍歷
for r in range(len(grid)):
for c in range(len(grid[0])):
if grid[r][c]=='1':
self.dfs(grid,r,c)
res+=1
return res
def dfs(self,grid,i,j):
# 需要對以i,j開始的四個方向進行遍歷
dirs=[[-1,0],[0,1],[0,-1],[1,0]]
# 將位置i,j置爲0,即已訪問
grid[i][j]='0'
for dir in dirs:
nr,nc=i+dir[0],j+dir[1]
if nr>=0 and nc>=0 and nr<len(grid) and nc<len(grid[0]):
if grid[nr][nc]=='1':
self.dfs(grid,nr,nc)
206. Reverse Linked List
題目解釋:逆轉一個單鏈表
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
題目分析:簡單的反轉鏈表的操作,就是採用頭插法。在這裏直接給出答案。
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
prev = None
curr = head
while curr:
next = curr.next
curr.next = prev
prev = curr
curr = next
return prev
總結
現在刷題開始有點感覺了,繼續下去,你是最‘胖’的
2019-5-8 天氣晴朗