207.课程表(中等)

思路:

i)先遍历一遍数组,把第二个元素的入度置为0存入新建的入度数组当中inDegree[]

ii)遍历一遍所有课程,如果入度为0,则存入队列中

iii)队列从前到后弹出元素,并加入数组res中记录已修的课程

搜寻数组中第二个元素是否与该弹出元素一致,一致则表明这是第一个元素的先修课程

将第一个元素的入度-1,判断若该元素的入度变为0了,则加入队列

 

代码:

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.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)这里若数组为空,返回的是true而不是false

 if(prerequisites.length==0) return true;

2)这里出来的是Integer而不是int

Integer num=queue.removeFirst();

3)核心代码

for(int[] p:prerequisites){
		if(p[1]==num){
               inDegree[p[0]]--;
					if(inDegree[p[0]]==0){
						queue.addLast(p[0]);
		}
	}
}

4)若res.size()==numCourses,表明已修完所有课程
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值