课程表——方法一——常规思路,代码简短但是效果不佳

本文通过将课程安排问题类比为游戏通关,解释了一种常规思路的解法。作者最初尝试使用递归,但遇到困难,最终选择了更简洁的解决方案。文中提到将采用逆向思考的方法来优化解法,即将无法学习的课程直接排除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode-cn.com/problems/course-schedule/
看官方思路太费劲了,不看了,把思路放在代码里讲
看完题目就感觉,这不就跟玩只狼一样嘛,打完这个boss才能解锁下面的剧情,和boss。(表示只狼真不是人玩的!T_T)
在这里插入图片描述
咳嗯!但是想要解锁新剧情,可能需要打多个boss。
所以第一种解法就肯定是按照这个思路来解的,一开始想用递归,后来发现递归太麻烦,不太行。遇到了几个坑,也算是基础不扎实的后果

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        p=[0]*numCourses#下标对应这个课程序号,下标的值则是要打完多少个boss才能解锁这个boss
        q=[[]for i in range(numCourses)]
        #下标对应课程序号,每个列表对应着只有学完下标课程才可以学列表中的课程序号,
        #注意!我一开始用的是[[]]*numCourses,结果发现这样的列表中每个子列表的元
        #素都是一样的,也就是相互影响,也就是说修改其中一个子列表就相当于对所有子列
        #表进行了修改,但我不知道为什么p就可以这么写而且互不影响,有大佬知道的话欢迎留言
        for i in prerequisites:
            q[i[1]].append(i[0])
            p[i[0]]+=1
        #这个for循环的目的是往里头输入值
        while 0 in p:
            for i in range(numCourses):
                if p[i]==0:
                    for j in q[i]:
                        p[j]-=1
                    p[i]=-1
        #当p中有0时,就说明这个boss解锁了,然后打boss,打完了,继续看能不能解锁新boss,然后继续打,然后无限循环~~
        for i in p:
            if int(i)>0:
                return False
        return True
        #完事儿!检索p中有没有大于0的课程,没有就是通关了,有就说明这游戏确实不是人玩的,有些boss你就是打不过(比如破戒僧)

在这里插入图片描述
方法二是逆向结题,看这里面有没有根本学不了的课,有就直接毙了。应该会快很多。明早再写,啊不,今早再写…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值