这两个题基本一样,会写一个基本就会写另外一个
207.
There are a total of n courses you have to take, labeled from 0
to n-1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
Example 1:
Input: 2, [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take.
To take course 1 you should have finished course 0. So it is possible.
Example 2:
Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take.
To take course 1 you should have finished course 0, and to take course 0 you should
also have finished course 1. So it is impossible.
Note:
- The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
- You may assume that there are no duplicate edges in the input prerequisites.
题意:给出一些课程,不过有些课程需要先修条件,以课程对的形式给出,判断是否能完成。
思路:判断是否是有向无环图。首先把课程对存在一个dict里面,把每个值作为key,后面跟着的所有值作为value,存进list中。然后再存每一个值的出度。首先判断取出出度为0的点,然后把该值的出度设置为0,然后把该点连接的线都给去掉。遍历n次,如果有一次没找到出度为0的点,就返回false.
import collections
class Solution(object):
def canFinish(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
graph_edge=collections.defaultdict(int)
graph_value=collections.defaultdict(list)
for u,v in prerequisites:
graph_value[v].append(u)
graph_edge[u]+=1
for i in range(numCourses):
flag=0
temp=-1
for j in range(numCourses):
if(graph_edge[j]==0):
flag=1
temp=j
break
#表示没有找到入度为0的点
if(flag==0):
return False
graph_edge[temp]=-1
for k in graph_value[temp]:
graph_edge[k]-=1
return True
210. Course Schedule II
要求返回修课的顺序,所以只需要把每次设置为-1的点存到list当中