LeetCode 210 课程安排问题II Python

75 篇文章 0 订阅
72 篇文章 0 订阅
def findOrder(self, numCourses, prerequisites):
    """
    My  Method Optimize
    算法:拓扑排序
    思路:
        相较于My  Method Basic
        最重要的改变就是用空间换时间,加了一个outdegree数组来记录每个节点的出度情况!这样也更直观!
        然后[x,y]的pair对在图的节点中是y-->neigbors (x),把x记录在y的neighbor中,这样y 在队列
        中pop出去的时候,直接遍历y的neighbors就可以了,不用去遍历所有的节点,
        用outdegree出度数组来记录每个节点的出度,将出度为0的节点入队列
    复杂度分析:
        时间:ON,遍历一遍所有节点
        空间:ON,outqueue,graph,queue的存储空间

    """
    graph = [[] for _ in range(numCourses)]
    outdegree = [0] * numCourses
    for x, y in prerequisites:
        outdegree[x] += 1
        graph[y].append(x)
    queue = []
    for i in range(numCourses):
        if outdegree[i] == 0:
            queue.append(i)
    result = []
    while queue:
        node = queue.pop(0)
        numCourses -= 1
        result.append(node)
        for i in graph[node]:
            outdegree[i] -= 1
            if outdegree[i] == 0:
                queue.append(i)
    return result if numCourses == 0 else []
def findOrder1(self, numCourses, prerequisites):
    """
    My  Method Basic
    算法:拓扑排序
    思路:
        就是拓扑排序的思想
        要注意的是题目中的prerequisites的序列对[x,y]是x-->y,所以构建图的时候注意
        这种解法只击败3%的人,是比较愚钝的一种方法
        即只建立图的关系,然后图中节点的neighbor存储的是上面的x出发,x的邻居包含y

        ?这样解的话劣势就是,一个出度为0的节点pop后,必须遍历所有的其他图的节点才能将
        包含node的节点中的node remove掉,虽然我这里换成了集合set来加快查找,但是这样还是
        比较慢的!
    """
    graph = [set() for _ in range(numCourses)]
    for x, y in prerequisites:
        graph[x].add(y)
    queue = []
    for i in range(len(graph)):
        if len(graph[i]) == 0:
            queue.append(i)
    result = []
    while queue:
        node = queue.pop(0)
        numCourses -= 1
        result.append(node)
        for i in range(len(graph)):
            if i != node and node in graph[i]:
                graph[i].remove(node)
                if len(graph[i]) == 0:
                    queue.append(i)
    if numCourses != 0:
        return []
    else:
        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值