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

被折叠的 条评论
为什么被折叠?



