20天拿下华为OD笔试之【BFS】2023Q1-快速开租建站【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解

【BFS】2023Q1-快速开租建站

题目描述与示例

题目描述

当前 IT 部门支撑了子公司颗粒化业务,该部门需要实现为子公司快速开租建站的能力,建站是指在一个全新的环境部署一套 IT 服务。每个站点开站会由一系列部署任务项构成,每个任务项部署完成时间都是固定和相等的,设为 1。部署任务项之间可能存在依赖,假如任务 2 依赖任务 1,那么等任务 1 部署完,任务 2 才能部署。任务有多个依赖任务则需要等所有依赖任务都部署完该任务才能部署。没有依赖的任务可以并行部署,优秀的员工们会做到完全并行无等待的部署。给定一个站点部署任务项和它们之间的依赖关系,请给出一个站点的最短开站时间。

输入描述

第一行是任务数 taskNum,第二行是任务的依赖关系数 relationsNum

接下来 relationsNum 行,每行包含两个 id,描述一个依赖关系,格式为:IDi IDj,表示部署任务 i 部署完成了,部署任务 j 才能部署,IDiIDj 值的范围为:[0, taskNum)

注:输入保证部署任务之间的依赖不会存在环。

输出描述

一个整数,表示一个站点的最短开站时间。

备注

1 < taskNum <= 100
1 <= relationsNum <= 5000

示例一

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PSvF2Xsp-1687937724974)(https://og7kl7g6h8.feishu.cn/space/api/box/stream/download/asynccode/?code=N2Y5NGJhMjljY2MxYjg5YTQ0MzNiZDBkYmFmODk3OGVfczI3TFJPd0k0UkYyc3dQbm5sdXVKdkFBcjlLaUswdHdfVG9rZW46RGlwV2JLclNlb2V6WVB4MGIwVWNaQVpFbnlmXzE2ODY5Nzk2NzI6MTY4Njk4MzI3Ml9WNA)]

输入

5
5
0 4
1 2
1 3
2 3
2 4

输出

3

说明

5 个部署任务项,5 个依赖关系,如下图所示。我们可以先同时部署任务项 0 和任务项 1,然后部署任务项 2,最后同时部署任务项 3 和任务项 4。最短开站时间为 3

示例二

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCdFcq5B-1687937724975)(https://og7kl7g6h8.feishu.cn/space/api/box/stream/download/asynccode/?code=NTRiMDAxYWFlZTM3Y2RhZDhiMzY5YzFkYTQ5NTlmODdfN3BHYkZzQmFEZXF5cm5kbzFudlpRRmFudVBjTVhyemhfVG9rZW46U0VWRGJFSnM1b1RjeE14Smo2ZGNHckxLbm9nXzE2ODY5Nzk2NzI6MTY4Njk4MzI3Ml9WNA)]

输入

5
3
0 3
0 4
1 3

输出

2

说明

5 个部署任务项,3 个依赖关系,如下图所示。我们可以先同时部署任务项 0,任务项 1,任务项 2。然后再同时部署任务项 3 和任务项 4。最短开站时间为 2

解题思路

注意,本题和LC1136. 并行课程几乎完全一致。唯一的区别在于,本题无需考虑存在环的情况,即一定可以完成拓扑排序,更加简单。

代码

# 题目:2023Q1-快速开租建站
# 分值:200
# 作者:闭着眼睛学数理化
# 算法:多源BFS/拓扑排序
# 代码看不懂的地方,请直接在群上提问

from collections import deque

# 输入节点数
n = int(input())
# 输入依赖关系数目
m = int(input())

# 初始化邻接表,长度为n
neighbor_table = [list() for _ in range(n)]
# 初始化入度数组,长度为n
inDegreeList = [0] * n

# 构建邻接表和入度数组
for _ in range(m):
    x, y = map(int, input().split())
    # y依赖于x,因此延长节点x的邻接表
    neighbor_table[x].append(y)
    # y的入度+1
    inDegreeList[y] += 1

# 初始化队列,用于维护BFS过程,初始化的节点为入度为0的哪些节点
q = deque( [i for i in range(n) if inDegreeList[i] == 0] )
# 搜索的层数
level = 0

# 进行BFS搜索
while len(q) > 0:
    # 获得队列的长度,为该层BFS搜索出队的节点数
    qSize = len(q)
    # 搜索层数+1
    level += 1
    # 初始qSize次
    for _ in range(qSize):
        # 当前节点
        cur = q.popleft()
        # 遍历当前节点的所有下一个点
        for nxt in neighbor_table[cur]:
            # 对于nxt,入度-1
            inDegreeList[nxt] -= 1
            # 如果nxt的入度降为0了,可以加入队列中,进行后续的BFS
            q.append(nxt)

print(level)

时空复杂度

时间复杂度:O(N)。遍历所有节点

空间复杂度:O(N)。队列、入度列表所需空间。

华为OD算法冲刺训练

  • 华为OD算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 30+天陪伴式学习,20+直播课时,300+动画图解视频,200+LeetCode经典题,100+华为OD真题,还有简历修改与模拟面试将为你解锁

  • 可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 sheepvipvip了解更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
华为od机试中,新校选址问题是一个关于使用Java语言解决的问题。在解决这个问题时,我们可以通过以下步骤来完成。 首先,我们需要理解问题的要求和限制条件。新校选址的目标是在一个给定的地图上找到一个合适的位置来建设新校。这个位置应满足一定的条件,比如与周围的住宅区距离不宜过远,应尽可能靠近居民区。限制条件可能还包括校面积和周边环境等。 接下来,我们需要获取地图的数据。可以通过读取一个地图文件或者从数据库中查询地图数据来获得地图的信息。地图数据的存储方式可以灵活选择,比如使用二维数组或者邻接矩阵。 然后,我们需要编写一个Java程序来实现新校选址算法。可以使用图的遍历算法,比如深度优先搜索(DFS)或广度优先搜索(BFS)来实现。算法的核心是通过递归或循环遍历地图上的每一个位置,并根据选址条件进行判断和筛选。 最后,我们需要输出选址结果。可以将选定的位置以某种方式标记在地图上,比如输出一个新的地图文件或者在图形界面中显示。同时,还可以输出选址的具体坐标和其他相关信息,以便后续的校建设工作。 总之,通过使用Java语言,我们可以通过一个新校选址问题来展示我们在算法设计和编程方面的能力。相信在华为od机试中,通过合理的数据处理和算法实现,我们可以解决这个问题并得出满意的选址结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值