LeetCode 207. 課程表(Medium)
題解
思路
程式碼
from collections import deque
class Solution:
### 1227 BFS(40 ms,15.7 MB)
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
queue = deque()
# 初始化入度表全0,鄰接表全為空
indegrees = [0 for _ in range(numCourses)]
adjacency = [[] for _ in range(numCourses)]
# 填充入度表和鄰接表
for cur, pre in prerequisites:
indegrees[cur] += 1 # 累計每門課的前置課有多少門(即每個節點的入度)
adjacency[pre].append(cur) # 累計當前課程是多少門課的前置課
# 將所有沒有前置課的節點入隊(即入度為0的起始節點入隊)
for i in range(len(indegrees)):
if not indegrees[i]: queue.append(i)
# 開始TopSort,當queue非空時,進行迴圈
while queue:
pre = queue.popleft() # 前置課程出隊
numCourses -= 1 # 待排序課程減一
# 遍歷當前前置課的所有後置課
for cur in adjacency[pre]:
# 後置課的入度少一,若入度為0,則此後置課作為新的前置課入隊
indegrees[cur] -= 1
if not indegrees[cur]: queue.append(cur)
return not numCourses # 判斷全部課程是否排完
### 1227 DFS(44 ms,17.4 MB)
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
# 判斷
def dfs(i, adjacency, flag):
if flag[i] == -1: return True # flag[i] == -1表示表示此節點已被訪問
if flag[i] == 1: return False # flag[i] == 1表示二次訪問此節點,即出現環,返回False
flag[i] = 1 # 首次訪問該節點時令flag[i] = 1表示此節點已經訪問
# 遍歷該節點的所有後置節點
for j in adjacency[i]:
# 若出現二次訪問某節點,即出現環,返回False
if not dfs(j, adjacency, flag): return False
flag[i] = -1 # 若該節點的所有後置節點均滿足條件,則置此節點的flag為-1,並返回True表示可行
return True
# 初始化鄰接表全為空,flag全為0表示還未訪問
adjacency = [[] for _ in range(numCourses)]
flag = [0 for _ in range(numCourses)]
# 填充鄰接表(即每門前置課有多少門後置課)
for cur, pre in prerequisites:
adjacency[pre].append(cur)
# 對於每一門課,若其後置課出現了環,則返回False
for i in range(numCourses):
if not dfs(i, adjacency, flag): return False
return True # 對於每一門課,若其後置課都滿足條件,則返回True
相關文章
- 207. 課程表
- 力扣刷題筆記:207. 課程表力扣筆記
- LeetCode題解(0210):課程表II(Python)LeetCodePython
- LeetCode - Medium - 322. Coin ChangeLeetCode
- Leetcode-Medium 621. Task SchedulerLeetCode
- LeetCode - Medium - 11. Container With Most WaterLeetCodeAI
- 學校課程表爬取
- leetcode240——搜尋二維矩陣(medium)LeetCode矩陣
- LeetCode 452. Minimum Number of Arrows to Burst Balloons Sort/MediumLeetCode
- 3.25 建立報名表和課程表
- 207. Course Schedule
- --查詢班級表、課程表、學生選課表、學生表、成績表、15(3+2)計算
- 【LeetCode】455. Assign Cookies 分發餅乾(Medium)(JAVA)每日一題LeetCodeCookieJava每日一題
- 必看,經典sql面試題2(學生表_課程表_成績表_教師表)SQL面試題
- 必看,經典sql面試題1(學生表_課程表_成績表_教師表)SQL面試題
- [LeetCode 刷題] 3. 無重複字元的最長子串 (Medium)LeetCode字元
- Exact Neighbours (Medium)
- Python開發系列課程彙總 - 課程大綱Python
- 課程連結
- 課程介紹
- 課程講義
- 課程實習
- LeetCode每日一題--621. 任務排程器(雜湊表)LeetCode每日一題
- HarmonyOS 第一課:基礎課程
- HarmonyOS 第一課:中級課程
- PYTHON openpyxl 讀取課程表,輪值排班表,輸出每日班級簡報Python
- [Typescript] 152 Medium - IsOddTypeScript
- 課程管理系統
- openERP課程轉載
- 教學課程安排
- 1410: 課程平均分
- FPGA課程培訓FPGA
- Homepage 課程主頁
- PHP課程總結PHP
- 資料庫課程作業筆記 - 編寫表單驗證資料庫筆記
- Doris建立表報錯Failed to find enough host with storage medium問題解決AI
- [Typescript] 151. Medium IsUnionTypeScript
- [Typescript] Medium 152. IsFixedStringLiteralTypeTypeScript