最一开始的思路是和前几题一样模拟过程,但是时间复杂度很高很高。
cpp
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<bool> vec(numCourses);
unordered_map<int,vector<int>> hash;
for(int i=0;i<prerequisites.size();i++){
vec[prerequisites[i][0]]=1;
hash[prerequisites[i][0]].push_back(prerequisites[i][1]);
}
while(1){
bool b=1;
for(auto it=hash.begin();it!=hash.end();it++){
if(vec[it->first]==0) continue;
bool bb=0;
vector<int> v=it->second;
for(int i=0;i<v.size();i++) if(vec[v[i]]==1){bb=1;break;}
if(bb==0){
b=0;
vec[it->first]=0;
it->second.clear();
}
}
if(b==1) break;
}
bool b=0;
for(int i=0;i<vec.size();i++) if(vec[i]==1) b=1;
if(b==0) return 1;
return 0;
}
};
dfs时间复杂度也很高......
cpp
class Solution {
public:
bool result=1;
vector<vector<int>> prerequisites;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<bool> vec(numCourses);
this->prerequisites=prerequisites;
for(int i=0;i<vec.size();i++){
vector<bool> v(numCourses);
dfs(i,v);
if(result==0) return 0;
}
return result;
}
void dfs(int now,vector<bool> v){
v[now]=1;
for(int i=0;i<prerequisites.size();i++){
if(prerequisites[i][1]==now){
if(v[prerequisites[i][0]]==1){result=0;return;}
dfs(prerequisites[i][0],v);
prerequisites.erase(prerequisites.begin()+i);
i--;
}
}
}
};