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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值