首页 > 编程语言 >每日一道算法题之拓扑排序之课程表

每日一道算法题之拓扑排序之课程表

时间:2024-12-11 21:55:36浏览次数:2  
标签:cnt int 拓扑 入度 numCourses ++ 课程表 new 排序

image

import java.util.ArrayList;
import java.util.Deque;

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        // 思路: 入度为0的点入队。依次出队的时候。遍历当前点的指向。入度减1,
        // 如果入度为0.进队。
        // 队列为空了。但是还有点没有入队。那么就是有环。

        int[] cnt = new int[numCourses]; // 保存每个点的入度。

        // 邻接表实现图
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();

        for (int i = 0; i < cnt.length; i++) {
            graph.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            int from = prerequisites[i][1];
            int to = prerequisites[i][0];
            graph.get(from).add(to);
            cnt[to]++; // 入度+1
        }

        int[] queue = new int[numCourses]; // 队列
        int l = 0;
        int r = 0;

        // 入度为0的先进队列
        for (int i = 0; i < numCourses; i++) {
            if (cnt[i] == 0) {
                queue[r++] = i;
            }
        }
        int[] ans = new int[numCourses];
        int a = 0;
        // 依次出队
        while (l != r) {
            int cur = queue[l++]; // 出队
            ans[a++] = cur; // 收集答案
            for (int next : graph.get(cur)) {
                cnt[next]--; // 入度减一
                if (cnt[next] == 0) {
                    // 入度为0.可以进队
                    queue[r++] = next;
                }
            }

        }
        if (a == numCourses) {
            return ans;
        }
        return new int[] {};
    }
}

标签:cnt,int,拓扑,入度,numCourses,++,课程表,new,排序
From: https://www.cnblogs.com/clllll/p/18600838

相关文章

  • PTA 7-1 通讯录排序
    输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。输入格式:输入第一行给出正整数n(<10)。随后n行,每行按照“姓名生日电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文......
  • 选择排序
    选择排序这里也用到了冒泡排序的写法。由题说明,用指针方法对10个整数按由大到小顺序排序。首先声明选择排序基本和冒泡排序法一样,只不过多加了一个调用函数环节。在后面会说明我的错误电点,同时我也会在另一篇冒泡排序中详细文字叙述效果图和代码可参照本文。代码如下`#include......
  • datagridview点击列头对当前列进行排序的功能无效
    DataGridView的默认行为是支持通过单击列头对列进行排序,但在以下情况下可能会取消该功能或无法使用:1.绑定的数据源不支持排序如果DataGridView的数据源是绑定到一个不支持排序的集合(例如,List或未实现IBindingList的对象),排序功能会被禁用。2.列的SortMode设置为DataG......
  • 【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
    目录......
  • 删除排序链表中的重复元素 II
    题解:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*deleteDuplicates(structListNode*head){intflag;//标记是否需要删除structListNode*dummy=(structList......
  • 算法--排序算法
    选择排序#选择排序#选择排序思路:#-每次从[i,n-1]区间中选择最小值,放到i位置上#-i取值为[0,n-1],因为如果最后只有一个数,则无需查询,i取值为[0,n-2]即可defselect_sort(nums:list[int]):n=len(nums)ifn<=1:returnforiinr......
  • C语言中实现归并排序(Merge Sort)
    归并排序(MergeSort)是一种基于分治法(DivideandConquer)的高效排序算法,具有稳定性和O(nlogn)的时间复杂度,特别适用于处理大规模数据。基本原理归并排序通过以下步骤实现排序:分割(Divide):递归地将数组分成两半,直到每个子数组仅包含一个元素。合并(Conquer):将两个有序子数组合......
  • 交换排序----快速排序
    快速排序快速排序是一种高效的排序算法,它采用分治法策略,将数组分为较小和较大的两个子数组,然后递归排序两个子数组。快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列......
  • 常见的排序算法
    目录1.冒泡排序2.选择排序3.插入排序4.希尔排序5.递归6.归并排序7.快速排序排序的稳定性1.冒泡排序1.比较相邻的元素,如果前一个元素比后一个元素大,则交换这两个元素的位置。2.每一对相邻元素如此反复,从开始的第一对元素到结尾的最后一对元素。最终最后的位置就是......
  • 数据结构6.4——归并排序
    基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为,称为二路归并。核心思想:将两个已经排好序的数组,合成......