207. 课程表(中等)

本文讲解了如何使用广度优先搜索(BFS)实现拓扑排序,解决课程依赖问题。通过入度表分析,确保无环,演示了从构建入度表到队列处理的详细步骤,以判断是否能完成所有课程的学习。

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

思路:

广度优先遍历,是拓扑排序,主要是不能出现环

利用一个入度表

 

代码:

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
		if(numCourses==0) return false;
        //这里若数组为空,返回的是true而不是false
        if(prerequisites.length==0) return true;
		
        //这里不能写List,而是写成LinedList才能通过编译
		LinkedList<Integer> queue=new LinkedList<>();
		
		int[] inDegree=new int[numCourses];
		
		//遍历所有节点,有入度的加度
		for(int[] p:prerequisites){
			inDegree[p[0]]++;
		}
		
        //遍历所有课程
		for(int i=0;i<numCourses;i++){
			if(inDegree[i]==0){
				queue.addLast(i);
			}
		}
		
		List<Integer> res=new ArrayList<>();
		
		while(!queue.isEmpty()){
            //这里出来的是Integer而不是int
			Integer num=queue.removeFirst();
			
			//相当于把所有值都存到res里
			res.add(num);
			//遍历所有临边
			for(int[] p:prerequisites){
				if(p[1]==num){
                    inDegree[p[0]]--;
					if(inDegree[p[0]]==0){
						queue.addLast(p[0]);
					}
				}
			}
		}
			
		return res.size()==numCourses;
    }
}

 

分解:

1)numCourses==0返回false,但数组为空prerequisites.length==0,则返回true

2)先遍历一遍数组,把每一组的第一个元素的入度自增,其余默认为0

3)把入度为0的加入到队列中,再逐个出队,通过这个数字找到临边,减去临边的入度,如果临边的入度这时为0,就加入队列。

注意:每次出队后,都要把元素加入到res中,最后比较res的长度与课程数是否相同(能加入队列说明入度都为0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值