题目
思路
- 无语了,这题目能一对多能不能早说…写了半天一对一结果发现测试用例里面可以一对多.
- 润去题解,这是图的拓扑排序
代码
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] nums = new int[numCourses];
HashMap<Integer, List<Integer>> map = new HashMap<>();
for(int i=0;i<prerequisites.length;i++){
int key = prerequisites[i][0];
int value = prerequisites[i][1];
if(key==value) return false;
nums[key]++;
List<Integer> list = new ArrayList<>();
if(map.containsKey(key)){
list = map.get(key);
}
list.add(value);
map.put(key,list);
}
Queue<Integer> que = new LinkedList<>();
for(int i=0;i<numCourses;i++){
if(nums[i]==0) que.add(i);
}
int count=0;
while(!que.isEmpty()){
int now = que.poll();
count++;
List<Integer> list = map.get(now);
if(list!=null){
for(int i=0;i<list.size();i++){
nums[list.get(i)]--;
if(nums[list.get(i)]==0) que.add(list.get(i));
}
}
}
return count == numCourses;
}