日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Leetcode 207.课程表

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 207.课程表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

課程表

現在你總共有 n 門課需要選,記為?0?到?n-1。

在選修某些課程之前需要一些先修課程。?例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示他們: [0,1]

給定課程總量以及它們的先決條件,判斷是否可能完成所有課程的學習?

示例 1:

輸入: 2, [[1,0]]

輸出: true

解釋:?總共有 2 門課程。學習課程 1 之前,你需要完成課程 0。所以這是可能的。

示例 2:

輸入: 2, [[1,0],[0,1]]

輸出: false

解釋:?總共有 2 門課程。學習課程 1 之前,你需要先完成?課程 0;并且學習課程 0 之前,你還應先完成課程 1。這是不可能的。

說明:

  1. 輸入的先決條件是由邊緣列表表示的圖形,而不是鄰接矩陣。詳情請參見圖的表示法
  2. 你可以假定輸入的先決條件中沒有重復的邊。

?

拓撲排序

對一個有向無環圖G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點 u 和 v,若存在由 u 到 v的路徑,則在拓撲排序序列中一定是 u 出現在 v 的前邊。

?

在一個有向圖中找到一個拓撲排序序列的過程如下:

?

從有向圖中選擇一個沒有前驅(入度為0)的頂點輸出。

刪除1. 中的頂點,并且刪除從該頂點出發的全部邊。

重復上述兩步,直到剩余的網中不存在沒有前驅的頂點為止。

?

可以利用寬度優先遍歷的思想完成。

設置一個count 記錄輸出的頂點個數,用一個隊列記得當前入度為0的結點。

從入度為 0 的結點入隊。然后隊列不空的時候循環執行,出隊,將出隊頂點輸出,count++,將由此頂點引出的邊所指向的頂點的入度都減1,并且將入度變成0的頂點入隊,隊列為空退出,排序結束。判斷n是否等于圖中頂點個數,如果等于,排序成功。

圖的存儲結構:

1、鄰接矩陣表示法:

如果 第 1個點和第 3個點 相連則 matrix[0][2]=1;如果兩節點之間有一條弧,則鄰接矩陣中對應的元素為1;否則為0。可以看出,這種表示法非常簡單、直接。但是,在鄰接矩陣的所有n*n 個元素中,只有 m個為非零元。如果網絡比較稀疏,這種表示法浪費大量的存儲空間,從而增加了在網絡中查找弧的時間。

這里寫圖片描述

2、鄰接表表示法:

鄰接表表示法將圖以鄰接表(adjacency lists)的形式存儲在計算機中。所謂圖的鄰接表,也就是圖的所有節點的鄰接表的集合;而對每個節點,它的鄰接表就是它的所有出弧。鄰接表表示法就是對圖的每個節點,用一個單向鏈表列出從該節點出發的所有弧,鏈表中每個單元對應于一條出弧。為了記錄弧上的權,鏈表中每個單元除列出弧的另一個端點外,還可以包含弧上的權等作為數據域。圖的整個鄰接表可以用一個指針數組表示。

這里寫圖片描述

?

 1 class Solution {
 2     public boolean canFinish(int numCourses, int[][] prerequisites) {
 3         int[][] matrix = new int[numCourses][numCourses]; // i -> j //鄰接矩陣存儲圖 
 4         int[] indegree = new int[numCourses]; // 統計每個節點的入度 
 5         for (int i = 0; i < prerequisites.length; i++) {
 6             int ready = prerequisites[i][0];
 7             int pre = prerequisites[i][1];
 8             if (matrix[pre][ready] == 0)
 9                 indegree[ready]++; matrix[pre][ready] = 1;
10         }
11         int count = 0;
12         Queue<Integer> queue = new LinkedList();
13         for (int i = 0; i < indegree.length; i++) {
14             if (indegree[i] == 0) queue.offer(i);
15         }
16         while (!queue.isEmpty()) {
17             int course = queue.poll();
18             count++;
19             for (int i = 0; i < numCourses; i++) {
20                 if (matrix[course][i] != 0) {// 節點 i 與該節點相連 
21                     indegree[i]--;
22                     // 與剛出隊的節點相連的節點,入度減一 
23                     if (indegree[i] == 0) {
24                         // 如果為0,說明沒有前驅,可以訪問 
25                         queue.offer(i);
26                     }
27                 }
28             }
29         }
30         return count == numCourses; // 如果所有節點是否都訪問了,如果是說明成功 
31     }
32 }

?

?

?

轉載于:https://www.cnblogs.com/kexinxin/p/10203019.html

總結

以上是生活随笔為你收集整理的Leetcode 207.课程表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。