(dfs+并查集+图遍历拓展)头条2019校招第二题 部门:leetcode200 +变种题,百词斩2019校招题求矩阵能不能走出某个字符串

本文介绍了如何利用DFS和BFS解决两道面试题:一是判断给定二维矩阵中包含多少个由1表示的陆地区域(岛屿),二是判断矩阵内是否可以走出给定字符串。文章详细阐述了DFS和BFS的特点、区别以及在图的存储与搜索中的应用,并提供了Python和Java的实现思路。
摘要由CSDN通过智能技术生成

头条题目:
给定M*M数组。1表示团队。2个团队如果上下或者左右方向相邻。表明有合作关系。
有合作会形成部门。无合作就放到不同部门。
判断输入里多少部门。
python和c++一个思路,python只有80,c++能ac,估计还是某些例子递归的时候内存溢出了。
考点:
leetcode200:Number of Islands Total
Number of Islands Total Accepted: 8305 Total Submissions: 38192
Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
题意大致是,给你一个有1和0组成的二维字符数组,1代表陆地,0代表水。问被水包围的连通陆地区域的个数。
使用DFS,BFS,并查集均可以解决。
Example 1:
4
11110
11010
11000
00000
Answer: 1

Example 2:
4
11000
11000
00100
00011
Answer: 3
思路:

该题用dfs的做法。核心是递归。
两个for循环来遍历整个二维矩阵,
对矩阵某个节点aij,当aij值为‘1’时,这是岛屿的开头,计数+1,再把节点丢到dfs递归函数里。
dfs递归函数,对于丢进来每个点,首先处理边界问题。不能处理的情况有,i,j超过了上下边界,aij的值为0,对这几种情况取或,只要出现一种情况就直接return结束递归。
如果该节点合法,就把节点值从1改为0,表示该节点是岛屿的一部分,已经访问完毕。然后对该节点上下左右四个方向分别进行dfs遍历,结束。
递归会自动处理节点的边界和是否访问过的问题,所以等到递归结束,就能把所有岛屿的数量得到。访问过的节点都会变成0,所以不会出现重复访问的情况。

class Solution:
    def numIslands(self,alist):
        count=0
        for i in range(len(alist)):
            for j in range(len(alist[0])):
                if(alist[i][j]=='1'):
                    count = count + 1
                    self.dfs(alist,i,j)
        return count
    def dfs(self,alist,i,j):
         if ( i >= len(alist) or j >= len(alist[0]) or i<0 or j<0 or alist[i][j]=='0'):
             return
         alist[i][j] = '0'
         self.dfs(alist, i + 1, j)
         self.dfs(alist, i - 1, j)
         self.dfs(alist, i, j + 1)
         self.dfs(alist, i, j - 1)
M=int(input())
input_list=[]
for i in range(M):
    input_list.append(list(input()))
print(Solution().numIslands(input_list))

同样的思路,另一种写法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值