207.課程表!

本題是一道拓撲排序的問題,個人感覺難度還是挺大的,即便寫出來也感覺有些似懂非懂。另外我個人認為本題并沒有使用傳統(tǒng)的拓撲排序,而是通過dfs來判斷的圖 有沒有形成環(huán)路。

本題的技巧主要是

  1. 把二維數(shù)組轉(zhuǎn)換成類似鄰接表的圖的表示方法
  2. 深度優(yōu)先搜索dfs來判斷從當前頂點出發(fā)有沒有形成環(huán)路。這里需要借助flag數(shù)組來進行標記,flag有3種狀態(tài),-1表有環(huán)路,0是默認值代表還未處理,1代表無環(huán)路
  3. 遍歷所有頂點,都沒有形成環(huán)路,則返回true

代碼:

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& p) {
        if(p.size()==0)
            return true;
        int n=p.size();
        vector<int> flag(numCourses,0);
        vector<vector<int>> tmp(numCourses,vector<int>());
        for(int i=0;i<n;i++)
            tmp[p[i][0]].push_back(p[i][1]);
        
        bool ans=true;
        for(int i=0;i<numCourses;i++)
            ans=ans&&dfs(i,flag,tmp);
        return ans;
        
        
    }
    
    bool dfs(int i,vector<int> &flag,vector<vector<int>> &tmp){
        if(flag[i]==-1)
            return false;
        if(flag[i]==1)
            return true;
        
        flag[i]=-1;
        int n=tmp[i].size();
        for(int j=0;j<n;j++){
            if(dfs(tmp[i][j],flag,tmp))
                continue;
            else
                return false;
        }          
        
        flag[i]=1;
        return true;
    }
};

預計用時10分鐘,實際用時48分鐘

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容