207-Course Schedule
【題目】
?你有n門課程需要上,幾位0到n-1.
?有些課程需要一些預(yù)備課程,例如:上課程0前需要先上課程1,表示為對(duì)[0,1]
? ? ? ? 假設(shè)給你所有課程和這些課程的對(duì)關(guān)系,有可能上完所有課程嗎?
? ? ? ? 舉例:
? ? ? ? 2 , [[1,0]]
? ? ? ? 這有2個(gè)課程需要完成,完成課程1前需要完成課程0,所以是可能的。
? ? ? ? 2 , [[1,0],[0,1]]
? ? ? ? 這有2個(gè)課程需要完成,完成課程1前需要完成課程0,完成課程0前需要完成課程1,所以是不可能的。
【分析】
?1. 問(wèn)題可以抽象為圖的問(wèn)題,就是判斷圖里是否存在環(huán)
? ? ? ? 2. 解決方法:(拓?fù)渑判?#xff09;,求出所有點(diǎn)的入度,循環(huán)遍歷n(n為點(diǎn)個(gè)數(shù))次,每一次循環(huán)里判斷是否有點(diǎn)的入度 為0;若所有的點(diǎn)的入度都不為0,return false;
? ??反之,當(dāng)前點(diǎn)的入度置為-1,進(jìn)入下一次循環(huán);跳出循環(huán)后,return true
【算法實(shí)現(xiàn)】
public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<Set<Integer>> ls = new ArrayList<Set<Integer>>();for(int i=0; i<numCourses; i++) {ls.add(new HashSet<Integer>());}for(int i=0; i<prerequisites.length; i++) {ls.get(prerequisites[i][1]).add(prerequisites[i][0]);}int[] preNum = new int[numCourses];for(int i=0; i<numCourses; i++) {Set<Integer> set = ls.get(i); Iterator<Integer> it = set.iterator();while(it.hasNext()) {preNum[it.next()]++;}}for(int i=0; i<numCourses; i++) {int j;for(j=0; j<numCourses; j++) {if(preNum[j]==0)break;}if(j==numCourses)return false;preNum[j] = -1;Set<Integer> set = ls.get(j);Iterator<Integer> it = set.iterator();while(it.hasNext()) {preNum[it.next()]--;}}return true;} }?
轉(zhuǎn)載于:https://www.cnblogs.com/hwu2014/p/4518015.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的207-Course Schedule的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iphone/ipad图标尺寸
- 下一篇: spring 登录提示 Bad cred