首页 > 其他分享 >课程表(拓补排序)

课程表(拓补排序)

时间:2025-01-11 19:21:55浏览次数:1  
标签:压入 int indegree 入度 numCourses 课程表 排序 拓补

题目链接:https://leetcode.cn/problems/course-schedule-ii/description/

题意:

给定n门课程,规定只有学完某一个课程才能继续学下一门课程,让你输出学习顺序。如果成环,则返回空数组

思路:

拓补排序,入度删除法
需要提前准备一个indegree数组用来统计每个节点的入度大小
用数组模拟双端队列,先把入度为0的点压入队列,再将这个点的影响消除(即把邻接表中该点的to删除,同时对应到indegree中),如果indegree因此出现为0的点则再次压入,直到压完
如果压入的个数刚好等于节点个数,说明不是环图。

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int>gra[2005];
        vector<int>indegree(numCourses);
        for(int i=0;i<prerequisites.size();i++)
        {
            int from=prerequisites[i][1];int to=prerequisites[i][0];
            indegree[to]++;
            gra[from].emplace_back(to);
        }
        vector<int> qu;
        int l=0,r=0;
        for(int i=0;i<numCourses;i++)
        {
            if(indegree[i]==0)
            {
                qu.emplace_back(i);
                r++;
            }
        }
        int cnt=0;
        while(l<r)
        {
            int cur=qu[l++];
            cnt++;
            for(int next:gra[cur])
            {
                if(--indegree[next]==0)
                {
                    qu.emplace_back(next);
                    r++;
                }
            }
        }
        vector<int>em;
        return cnt==numCourses? qu:em;
    }
};

标签:压入,int,indegree,入度,numCourses,课程表,排序,拓补
From: https://www.cnblogs.com/benscode/p/18666106

相关文章

  • 20250108@Excel(排序问题+文本格式转换+查找多条件的个数)
    1.需求:首行标题需要显示 百分比问题:直接="时间进度:"&E1/E2,显示常规解决方法:使用text函数转换格式2.需求:当需要对某些数值排序时,如果出现相同数值,需要做并列排名问题:使用rank排序会出现中断层排名,如图,2之后是4解决方法:数与数之间进行比较,计算布尔值false的个数。3......
  • php二维数组根据某个字段排序
    1$worderData=[2[3'id'=>1,4'name'=>'张三',5'distance'=>0.1,6......
  • 2.6.桶排序
    桶排序桶排序也是一种非常快的排序算法,但是对于个别数组中某个元素比较大的情况比较费内存。它的实现分为三个步骤:第一步,根据数组创建桶。具体桶的个数取决于数组中元素的大小,所谓桶其实也是一个数组,只不过桶的索引代表数组的元素,而索引值代表在原数组中此元素的个数,例如......
  • 二分+排序
    https://codeforces.com/contest/2053/problem/Dhttps://blog.csdn.net/weixin_61825750/article/details/144799098#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#defineendl'\n'us......
  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • 冒泡排序:初学者的必经之路
    ......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • 多数元素(排序)
    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2思路:如果将数组 n......
  • C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代
    常见7种排序算法冒泡排序(BubbleSort)选择排序(SelectionSort)插入排序(InsertionSort)希尔排序(ShellSort)归并排序(MergeSort)快速排序(QuickSort)堆排序(HeapSort)计数排序(CountingSort)算法复杂度1、冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比......
  • python SQLAlchemy ORM——从零开始学习03 如何针对数据库信息进行排序
    03如何进行排序3-1准备工作:因为要排序,所以需要随机多谢数据,model见后文。也需要random进行随机frommodelimportUser,Enginefromsqlalchemy.ormimportsessionmakerimportrandomSession=sessionmaker(bind=Engine)session=Session()defadd_random():na......