大家好!
最近在加拿大参加LinkedIn的面试,被问到了LeetCode 207 课程表这道题。为了帮助大家更好地准备面试,我决定分享一下我的解题思路和Python代码。希望能帮到各位正在求职的小伙伴们!
题目:课程表
给定一个课程表,其中课程用从 0 到 numCourses - 1 的数字表示。有些课程可能有先修课程,例如,要学习课程 0,你可能需要先学习课程 1,那么课程 1 就称为课程 0 的先修课程。现在给你一个数组 prerequisites ,其中 prerequisites = 表示课程 bi 是课程 ai 的先修课程。请你判断是否可以完成所有课程的学习。
示例:
输入: numCourses = 2, prerequisites = ]
输出: true
解释: 可以完成课程学习。
输入: numCourses = 2, prerequisites = ,]
输出: false
解释: 存在循环依赖,无法完成课程学习。
算法思路:拓扑排序
这道题的核心在于使用拓扑排序算法。拓扑排序是将一个有向无环图(Directed Acyclic Graph,DAG)中的节点进行排序,使得对于图中的每条有向边 (u, v),节点 u 总是出现在节点 v 之前。如果图中存在环路,则无法进行拓扑排序。
具体步骤如下:
- 构建邻接表: 将课程及其先修课程的关系用邻接表表示,方便后续处理。
- 计算入度: 统计每个课程的入度(有多少门课指向它)。
- 入度为0的课程入队列: 将所有入度为0的课程(没有先修课程)放入队列。
- BFS遍历: 使用BFS遍历队列,每次取出一个课程,将其入度减1,如果其后续课程的入度变为0,则将其加入队列。
- 判断环路: 如果最后遍历的课程数量等于总课程数量,则说明没有环路,可以完成所有课程的学习;否则存在环路,无法完成所有课程的学习。
Python代码:
from collections import defaultdict, deque
def canFinish(numCourses, prerequisites):
graph = defaultdict(list)
in_degree = * numCourses
for course, pre_req in prerequisites:
graph.append(course)
in_degree += 1
queue = deque( == 0])
count = 0
while queue:
course = queue.popleft()
count += 1
for neighbor in graph:
in_degree -= 1
if in_degree == 0:
queue.append(neighbor)
return count == numCourses
#Example
numCourses = 2
prerequisites = ]
print(canFinish(numCourses, prerequisites)) # Output: True
numCourses = 2
prerequisites = ,]
print(canFinish(numCourses, prerequisites)) # Output: False
希望这个详细的解答能够帮助大家理解LeetCode 207 课程表这道题! 祝大家面试顺利!
如有任何问题,欢迎留言讨论!
加拿大小伙伴们加油哦!
加拿大这边面试真是越来越贴近算法了呢,要多练习LeetCode啦!

1 个赞
这篇关于LeetCode 207课程表的帖子非常实用!
在加拿大找工作,数据结构和算法是必备技能,LinkedIn面试尤其注重这方面。你的Python代码和算法解释清晰易懂,对于准备面试的小伙伴来说非常有帮助。
加拿大科技行业的招聘趋势显示,对具备扎实编程能力的候选人需求量很大。 掌握像拓扑排序这样的算法,能有效提升解决问题的能力,这在面试中非常加分。
除了LeetCode,建议大家也练习其他类型的算法题,并结合实际项目经验,才能更好地展现自己的能力。
个人建议:多刷题,但更重要的是理解算法背后的原理。 不要死记硬背代码,而是理解算法的思路和时间复杂度分析。 平时可以利用空闲时间练习,LeetCode, HackerRank等平台资源丰富。 祝大家在加拿大的求职之旅顺利!
加拿大LinkedIn面经:巧解LeetCode 207课程表(Python代码+算法拆解)
在加拿大求职,LinkedIn的重要性不言而喻。最近准备面试,刷LeetCode成了家常便饭
。今天就来分享一下我最近在LinkedIn上投递简历过程中遇到的一个经典算法题——LeetCode 207课程表,并结合加拿大的求职环境,谈谈我的感受和一些技巧。
这道题的核心是检测图中是否存在环,因为课程之间的依赖关系可以抽象成一个有向图。如果存在环,就意味着课程安排存在冲突,无法完成所有课程。 我采用的是拓扑排序的思路来解决这个问题。 首先,构建一个邻接表来表示课程之间的依赖关系。然后,用入度数组记录每个课程的入度(有多少课程依赖它)。接着,将入度为0的课程放入队列。之后,不断从队列中取出课程,更新其依赖课程的入度,并将入度变为0的课程加入队列。最后,如果能访问所有课程,则说明没有环;否则,存在环。
以下是我的Python代码实现:
from collections import defaultdict, deque
def canFinish(numCourses, prerequisites):
graph = defaultdict(list)
in_degree = * numCourses
for course, pre_req in prerequisites:
graph.append(course)
in_degree += 1
queue = deque()
count = 0
while queue:
course = queue.popleft()
count += 1
for neighbor in graph:
in_degree -= 1
if in_degree == 0:
queue.append(neighbor)
return count == numCourses
这段代码清晰地展现了拓扑排序的思想,时间复杂度为O(V+E),其中V是课程数量,E是依赖关系数量。 在加拿大,很多科技公司,特别是像Shopify、Amazon、Google等,都会在面试中考察算法和数据结构,所以掌握这类算法至关重要
。
然而,仅仅掌握算法是不够的。加拿大的面试,尤其是在LinkedIn上,更注重的是沟通能力和解决问题的能力。 在代码实现之外,我还会在面试中注重以下几点:
- 清晰地表达我的思路: 我会先用自然语言解释我的算法思路,再写代码,并解释代码的每一部分。这在加拿大面试中非常重要,因为他们注重团队合作,清晰的沟通能让你更容易融入团队。

- 处理边界情况: 我会考虑各种边界情况,例如空输入、只有一个课程等等,并解释如何处理这些情况。这体现了我的严谨性和对细节的关注。

- 代码的可读性和可维护性: 我会写出简洁、易懂的代码,并添加必要的注释。这在加拿大的工作环境中非常重要,因为团队合作需要代码易于理解和维护。

总而言之,在加拿大使用LinkedIn找工作,算法能力只是敲门砖。更重要的是,你需要将扎实的技术功底与优秀的沟通能力和解决问题的能力相结合,才能在竞争激烈的就业市场中脱颖而出! 加油吧,各位在加拿大求职的朋友们!
希望我的分享能帮助到大家!
敬启者:
见君分享于加国LinkedIn面试之经历,剖析LeetCode 207课程表之题,某心甚慰
。夫算法之道,贵在明理,今观君以拓扑排序解之,实得其中三昧。
夫拓扑排序者,乃处理有向无环图之良法也
。其精要在五步:
一曰构建邻接表,以存课程先后之序
二曰统计入度,察各课所受约束之多寡
三曰起于微末,取入度为零者入队列
四曰广度遍历,层层递进如春冰消融
五曰验其闭环,较已修课程与总数异同
昔者加国科技企业,尤重算法实务。某尝闻多伦多大学算法课程,亦以此题为范本,教导学子识图论之妙
。今观君代码,用defaultdict以建图,取deque以行遍历,诚得Python精髓。其时间复杂度为O(V+E),空间复杂度亦如是,实为最优之解。
某尝于温哥华参与技术讨论,见诸多同行于此题各有心得。然君之解,条分缕析,尤便于初学者领会。其判断循环依赖之法,以计数比对为要,诚可谓「以简驭繁」之典范
。
愿君此解,能助加国求职诸生,破面试之关隘。倘有疑问,不妨共论之
。谨祝前程似锦,早得心仪之职!
谨启

加拿大的科技行业发展迅速,未来可能会继续在人工智能和大数据领域取得重大突破。