“输入[[1,0],[2,1]],3输出[0,1,2],输入[[1,0],[2,1]],4输出[0,1,2,3],输入[[1,0],[0,1]],2输出[]
时间: 2023-10-04 07:08:52 浏览: 42
这个问题是一个拓扑排序的问题,可以使用 Kahn 算法来解决。
Kahn 算法的基本思想是:在有向无环图中,先从图中选出一个没有前驱节点的节点,并将其输出;然后将该节点从图中删除,并更新剩余节点的入度;重复上述过程,直到所有节点都被输出为止。 如果所有节点都被输出,则说明该图是 DAG(Directed Acyclic Graph),否则该图存在环。
对于这个问题,我们可以首先将输入转化为一个邻接表,表示每一个节点的后继节点。然后使用一个数组来记录每个节点的入度。接着,我们将所有入度为 0 的节点加入队列中,并不断取出队列头部节点,将其加入结果数组中,并将其所有后继节点的入度减 1。如果减 1 后某个节点的入度变成了 0,则将其加入队列。最后,如果结果数组的长度等于节点总数,则说明图是 DAG,返回结果数组,否则说明图存在环,返回空数组。
下面是 Python 的实现代码:
```python
def findOrder(numCourses, prerequisites):
graph = [[] for _ in range(numCourses)] # 邻接表
in_degree = [0] * numCourses # 记录每个节点的入度
# 初始化邻接表和入度数组
for x, y in prerequisites:
graph[y].append(x)
in_degree[x] += 1
queue = [i for i in range(numCourses) if in_degree[i] == 0] # 找到所有入度为0的节点
res = []
while queue:
node = queue.pop(0)
res.append(node)
for nxt in graph[node]:
in_degree[nxt] -= 1
if in_degree[nxt] == 0:
queue.append(nxt)
return [] if len(res) != numCourses else res
```
对于输入[[1,0],[2,1]],3输出[0,1,2]的测试用例,运行结果为:
```python
findOrder(3, [[1,0],[2,1]]) # [0, 1, 2]
```
对于输入[[1,0],[2,1]],4输出[0,1,2,3]的测试用例,运行结果为:
```python
findOrder(4, [[1,0],[2,1]]) # [0, 1, 2, 3]
```
对于输入[[1,0],[0,1]],2输出[]的测试用例,运行结果为:
```python
findOrder(2, [[1,0],[0,1]]) # []
```