Top 100 Linked Question 修煉------第200題、第206題

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 天氣晴朗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章