Leetcode210. 課程表 II

Every day a Leetcode

題目來源:210. 課程表 II

解法1:

什么是拓撲排序?

在這里插入圖片描述

我們考慮拓撲排序中最前面的節點,該節點一定不會有任何入邊,也就是它沒有任何的先修課程要求。當我們將一個節點加入答案中后,我們就可以移除它的所有出邊,代表著它的相鄰節點少了一門先修課程的要求。如果某個相鄰節點變成了「沒有任何入邊的節點」,那么就代表著這門課可以開始學習了。按照這樣的流程,我們不斷地將沒有入邊的節點加入答案,直到答案中包含所有的節點(得到了一種拓撲排序)或者不存在沒有入邊的節點(圖中包含環)。

上面的想法類似于廣度優先搜索,因此我們可以將廣度優先搜索的流程與拓撲排序的求解聯系起來。

算法:

在這里插入圖片描述

代碼:

/** @lc app=leetcode.cn id=210 lang=cpp** [210] 課程表 II*/// @lc code=start// 拓撲排序(廣度優先搜索)class Solution
{
public:vector<int> findOrder(int numCourses, vector<vector<int>> &prerequisites){// 鄰接矩陣vector<vector<int>> graph(numCourses, vector<int>());// 入度數組vector<int> inDegree(numCourses, 0);vector<int> ans;// 初始化鄰接矩陣和入度數組for (vector<int> &p : prerequisites){graph[p[1]].push_back(p[0]);inDegree[p[0]]++;}queue<int> q;// 把入度為 0 的節點(即沒有前置課程要求)放在隊列中for (int i = 0; i < inDegree.size(); i++)if (inDegree[i] == 0)q.push(i);while (!q.empty()){// 每次從隊列中獲得節點,我們將該節點放在排序的末尾,// 并且把它指向的課程的入度各減 1int u = q.front();q.pop();ans.push_back(u);for (auto &v : graph[u]){inDegree[v]--;// 有課程的所有前置必修課都已修完(即入度為 0),// 我們把這個節點加入隊列中if (inDegree[v] == 0)q.push(v);}}// 當隊列的節點都被處理完時,說明所有的節點都已排好序,// 或因圖中存在循環而無法上完所有課程for (int &in : inDegree){// 不可能完成所有課程if (in != 0)return {};}return ans;}
};
// @lc code=end

結果:

在這里插入圖片描述

復雜度分析:

時間復雜度: O(n+m),其中 n 為課程數,m 為先修課程的要求數。這其實就是對圖進行廣度優先搜索的時間復雜度。

空間復雜度: O(n+m)。題目中是以列表形式給出的先修課程關系,為了對圖進行廣度優先搜索,我們需要存儲成鄰接表的形式,空間復雜度為 O(n+m)。在廣度優先搜索的過程中,我們需要最多 O(n) 的隊列空間(迭代)進行廣度優先搜索,并且還需要若干個 O(n) 的空間存儲節點入度、最終答案等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715706.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715706.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html5新增標簽+css3新增標簽

新增標簽 一.html5新增標簽1.語義化標簽2.多媒體標簽&#xff08;1&#xff09;視頻video&#xff08;2&#xff09;音頻audio&#xff08;3&#xff09;.總結 3.input屬性4.表單屬性 二.css3新增選擇器1.新增選擇器&#xff08;1&#xff09;屬性選擇器&#xff08;2&#xff…

Ubuntu進入python時報錯:找不到命令 “python”,“python3” 命令來自 Debian 軟件包 python3

一、錯誤描述 二、解決辦法 進入”/usr/bin”目錄下&#xff0c;查看/usr/bin目錄中所有與python相關的文件和鏈接&#xff1a; cd /usr/bin ls -l | grep python 可以看到Python3指向的是Python3.10&#xff0c;而并無指向python3的軟連接 只需要在python與python3之間手動…

微服務治理:Nacos, Zookeeper, consul, etcd, Eureka等 5 個常用微服務注冊工具對比

當然&#xff01;下面是 Nacos、Zookeeper、Consul、etcd 和 Eureka 這五個常用的注冊中心的詳細對比&#xff1a; Nacos&#xff1a; Nacos 是由 HashiCorp 開發的高度可擴展和可靠的服務發現、配置管理和服務網格解決方案。它的架構基于一組服務器代理形成的共識組和與服務器…

Github配置SSH免密認證

以Ubuntu Server為例 生成SSH ssh-keygen -t ed25519 -C "your_emailexample.com" 如果系統不支持Ed25519算法&#xff0c;使用舊的命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 根據提示生成公私鑰文件&#xff0c;記下位置…

前端學習、CSS

CSS可以嵌入到HTML中使用。 每個CSS語法包含兩部分&#xff0c;選擇器和應用的屬性。 div用來聲明針對頁面上的哪些元素生效。 具體設置的屬性以鍵值對形式表示&#xff0c;屬性都在{}里&#xff0c;屬性之間用;分割&#xff0c;鍵和值之間用:分割。 因為CSS的特殊命名風格…

MySQL 常用優化方式

MySQL 常用優化方式 sql 書寫順序與執行順序SQL設計優化使用索引避免索引失效分析慢查詢合理使用子查詢和臨時表列相關使用 日常SQL優化場景limit語句隱式類型轉換嵌套子查詢混合排序查詢重寫 sql 書寫順序與執行順序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…

ctf_show筆記篇(web入門---php特性)

目錄 php特性 89&#xff1a;直接數組繞過preg_match當遇到數組時會直接報錯輸出0 90&#xff1a;這里利用了intval的特性 91&#xff1a;這里需要細節一點 92-93&#xff1a;這兩題的方法很多可以發散思維 94&#xff1a;還是利用小數繞過例如4476.0 95&#xff1a;這里…

HTML和CSS (前端共三篇)【詳解】

目錄 一、前端開發介紹 二、HTML入門 三、HTML基礎標簽 四、CSS樣式修飾 五、HTML表格標簽 六、HTML表單標簽 一、前端開發介紹 web應用有BS和CS架構兩種&#xff0c;其中我們主要涉及的是BS架構。而BS架構里&#xff0c;B&#xff08;Browser瀏覽器&#xff09;是客戶端的…

藍橋杯(3.1)

92. 遞歸實現指數型枚舉 import java.util.Scanner;public class Main {static int N 16;static int n;static int[] st new int[N]; public static void dfs(int u) {if(u > n) {for(int i1;i<n;i) {if(st[i] 1)System.out.print(i" ");}System.out.print…

798. 差分矩陣

Problem: 798. 差分矩陣 文章目錄 思路解題方法復雜度Code 思路 這是一個差分矩陣的問題。差分矩陣是一種用于處理區間修改問題的數據結構&#xff0c;它可以在O(1)的時間復雜度內完成區間的修改操作&#xff0c;然后在O(n)的時間復雜度內完成所有元素的更新操作。 在這個問題中…

【k8s管理--兩種方式安裝prometheus】

1、k8s的監控方案 1.1 Heapster Heapster是容器集群監控和性能分忻工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有個出名的監控agent–cAdvisor。在每個kubernetes Node上都會運行cAdvisor&#xff0c;它會收集本機以及容器的監控數(cpu,memory,filesystem,ne…

conda目錄遷移

conda默認安裝在系統目錄&#xff0c; 但隨著使用&#xff0c; 占用的空間越來越大&#xff0c; 需要遷移到其他目錄。 假設原來conda安裝在/home/leo/anaconda3目錄&#xff0c; 現在要遷移到/data路徑。 方法是&#xff1a; 1 移動文件位置 mv /home/leo/anaconda3 /dat…

python筆記_鍵盤輸入

例&#xff1a;從控制臺接收員工信息 name input("輸入姓名:") age input("輸入年齡:") id input("輸入id:") print("name",name) print("age",age) print("id",id) ——> 輸入姓名: 1&#xff0c;接收到的…

Ubuntu將c++編譯成.so文件并測試

一、準備cpp和h文件 創建test.cpp 在cpp中定義相加的函數funcAdd&#xff0c;給出函數的細節代碼 #include <iostream> using namespace std;int funcAdd(int x, int y) {return xy; }創建test.h 在h中聲明定義的函數&#xff0c;不需要任何細節 #ifndef __TEST__ #…

LeetCode 熱題 HOT 100(P1~P10)

&#x1f525; LeetCode 熱題 HOT 100 這里記錄下刷題過程中的心得&#xff0c;其實算法題基本就是個套路問題&#xff0c;很多時候你不知道套路或者模板&#xff0c;第一次嘗試去做的時候就會非常懵逼、沮喪和無助。而且就算你一時理解并掌握了&#xff0c;過一段時間往往會絕…

蘋果 Vision Pro零售部件成本價格分析

蘋果公司發布的全新頭戴式顯示器 Apple Vision Pro 雖然售價高達3499美元&#xff0c;但其制造成本同樣不菲&#xff0c;根據研究機構 Omdia 的估計&#xff0c;該頭顯僅零部件成本就超過了1500美元。這款頭顯的總零部件成本估計為1542美元&#xff0c;這還并不包括研發、包裝、…

騰訊云服務器CVM_云主機_云計算服務器_彈性云服務器

騰訊云服務器CVM提供安全可靠的彈性計算服務&#xff0c;騰訊云明星級云服務器&#xff0c;彈性計算實時擴展或縮減計算資源&#xff0c;支持包年包月、按量計費和競價實例計費模式&#xff0c;CVM提供多種CPU、內存、硬盤和帶寬可以靈活調整的實例規格&#xff0c;提供9個9的數…

【算法】順時針打印矩陣(圖文詳解,代碼詳細注釋

目錄 題目 代碼如下: 題目 輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。例如:如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則打印出數字:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 這一道題乍一看,沒有包含任何復雜的數據結構和…

Doris實戰——美聯物業數倉

目錄 一、背景 1.1 企業背景 1.2 面臨的問題 二、早期架構 三、新數倉架構 3.1 技術選型 3.2 運行架構 3.2.1 數據模型 縱向分域 橫向分層 數據同步策略 3.2.2 數據同步策略 增量策略 全量策略 四、應用實踐 4.1 業務模型 4.2 具體應用 五、實踐經驗 5.1 數據…

代碼隨想錄算法訓練營|day45

第九章 動態規劃 322.零錢兌換279.完全平方數代碼隨想錄文章詳解總結 322.零錢兌換 dp[i]表示湊成i所需的最少零錢個數 (1)先遍歷物品&#xff0c;后遍歷背包 func coinChange(coins []int, amount int) int {maxAmount : amount 1dp : make([]int, amount1)for i : 0; i &l…