欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > [LeetCode] 210. 课程表II

[LeetCode] 210. 课程表II

2024/10/25 1:53:40 来源:https://blog.csdn.net/weixin_65043441/article/details/143094051  浏览:    关键词:[LeetCode] 210. 课程表II

题目描述:

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。

  • 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。

返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为[0,1] 。

示例 2:

输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3]。另一个正确的排序是[0,2,1,3]。

示例 3:

输入:numCourses = 1, prerequisites = []
输出:[0]

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • ai != bi
  • 所有[ai, bi] 互不相同

题目链接:

. - 力扣(LeetCode)

解题主要思路:

其实这道题跟 "课程表" 几乎没差别,唯一的差别就是一个是返回属否合理,一个是返回排序结果。

经典的bfs拓扑排序题,先借助stl容器将有向图和节点对应的入度记录下来,接着先将入度为0的节点入队列,当队列不为空时循环进行以下操作:

        1. 提取头节点,将该节点存入ret数组中,并且对该节点的相邻节点去边

        2.判断邻居节点的入度是否为0,若为0则加入到队列中

最后再判断ret数组的size是否等于numCourses,如果等于,说明合理且能排序出结果;如果不等于,说明无法排序完全部课程并且返回一个空数组。

解题代码:

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int> ret;ret.reserve(numCourses);  // 提前开好空间并且不进行初始化vector<vector<int>> edges(numCourses);  // 邻接表vector<int> in(numCourses);  // 统计对应节点的入度// 建图for (auto& e : prerequisites) {int a = e[0], b = e[1];  // b --> aedges[b].push_back(a);++in[a];}// 找到入度为0的节点,加入队列中queue<int> que;for (int i = 0; i < numCourses; ++i) {if (in[i] == 0) que.push(i);}// bfswhile (!que.empty()) {// 提取头节点int front = que.front();  que.pop();ret.push_back(front);// 相邻节点去边for (auto& e : edges[front]) {--in[e];if (in[e] == 0) que.push(e);}}if (ret.size() == numCourses) return ret;else return {};}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com