
会编程的土豆 • 计科学习者
🔥 个人主页: 点击访问我的主页
📘 核心专栏1: 数据结构与算法
📘 核心专栏2: LeetCode Hot 100
✨ 面包会有的,牛奶会有的,一切都会有的!
1

cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>>graph(numCourses);
vector<int>indegree(numCourses,0);
for(int i=0;i<prerequisites.size();i++)
{
int a=prerequisites[i][0];
int b=prerequisites[i][1];
graph[b].push_back(a);
indegree[a]++;
}
queue<int>q;
for(int i=0;i<numCourses;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}
int learned=0;
while(!q.empty())
{
int course=q.front();
q.pop();
learned++;
for(int i=0;i<graph[course].size();i++)
{
int next=graph[course][i];
indegree[next]--;
if(indegree[next]==0)
{
q.push(next);
}
}
}
return learned==numCourses;
}
};
这个题是这样一个逻辑,首先看题目就是一个很经典的拓扑排序,他不是说一个课程完成之后才能进行下一个吗,这种就是很典型的拓扑排序,这种只需要判断是否有环就行了,为什么要判断有没有环,因为有环的话,他那个环的indegree就都是1了,如果是1的话,就无法进入队列,队列里的值表示的是可以直接修的课,无须其他课程先修完当做条件,所以最后才有个把这个课修完的话,这个课的下一个课就直接indegree--;修完一门课learned++一下,然后删掉这门课,有环的话,环上的课是不可能到indegree=0的,所以有环的话课删除掉的也就是learened掉的肯定是小于numcourses的;
**
2
**

cpp
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
// 1. 建图
vector<vector<int>> graph(numCourses);
vector<int> indegree(numCourses, 0);
for (auto& prereq : prerequisites) {
int ai = prereq[0]; // 要学的课
int bi = prereq[1]; // 先修课
graph[bi].push_back(ai); // bi → ai
indegree[ai]++; // ai 的入度+1
}
// 2. 初始化队列:入度为0的课可以直接学
queue<int> q;
for (int i = 0; i < numCourses; i++) {
if (indegree[i] == 0) {
q.push(i);
}
}
// 3. 拓扑排序,记录顺序
vector<int> order;
while (!q.empty()) {
int course = q.front();
q.pop();
order.push_back(course); // ← 关键:记录学完的课
for (int next : graph[course]) {
indegree[next]--;
if (indegree[next] == 0) {
q.push(next);
}
}
}
// 4. 判断是否有环
if (order.size() != numCourses) {
return {}; // 有环,返回空数组
}
return order;
}
};
这个和上一题非常相似,只不过多了个让输出顺序,无须大惊小怪,只需要建立一个动态数组order,把每次pop掉的课加进order数组即可,为什么呢,因为他这个队列就是按照顺序的,必须indegree为0了才能加入队列,加入进队列的都是按序列的,最后只需要判断有没有环,有环就是没有办法修完课,直接返回空,否则返回order数组
