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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】207. 课程表(Java、图、BFS、队列)

發布時間:2024/7/23 java 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】207. 课程表(Java、图、BFS、队列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 && 代碼
      • 二刷

題目描述

  • 刷的第一道圖相關的題,簡直考古
  • 要復習一下拓撲、鄰接矩陣之類的知識啦

思路 && 代碼

  • 前置課程看成入度,后置課程看成出度
  • 對于入度,只需要記錄有多少即可。
  • 對于出度,逐個記錄下來(用于完成后,更新對應結點的入度)
  • 初始化:從入度為0的結點開始記錄
  • BFS:可行課程加入隊列中,先進先出地更新出入度。
  • 時空復雜度:都是O(m + n),結點和邊都要遍歷到
class Solution {// BFS,時空復雜度都是 O(M + N),所有的鄰邊、結點都要遍歷到public boolean canFinish(int numCourses, int[][] prerequisites) {// 0. Initint[] indegrees = new int[numCourses]; // 入度記錄Queue<Integer> queue = new LinkedList<>(); // BFS:當前可行結點記錄List<List<Integer>> adjacency = new ArrayList<>(); // 出度結點記錄for(int i = 0; i < numCourses; i++) {adjacency.add(new ArrayList<>());}// 1. 入度、出度記錄for(int[] cp : prerequisites) {indegrees[cp[0]]++; // 入度計算adjacency.get(cp[1]).add(cp[0]); // 出度記錄}// 2. 從入度為0的結點開始BFSfor(int i = 0; i < numCourses; i++) {// 初始化:從入度為0的結點開始if(indegrees[i] == 0) {queue.add(i);}}// 3. 隊列不為空時,每次移除一個隊列課程,同時維護相關的出入度while(!queue.isEmpty()) {int pre = queue.poll();numCourses--;// 根據結點的出度列表,維護對應結點的入度值for(int temp : adjacency.get(pre)) {// 入度值為0時,加入可行結點的隊列中if(--indegrees[temp] == 0) {queue.add(temp);}}}return numCourses == 0;} }

二刷

  • 其實還是挺不錯的一道題啦,步驟清晰、結構簡單、思路明了,而且代碼就19行
  • 步驟分為三個部分:初始化、出入度初始化、課程維護
class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {// Part 1: initint[] in = new int[numCourses]; List<List<Integer>> out = new ArrayList<>(); for(int i = 0; i < numCourses; i++) {out.add(new ArrayList<>());}// Part 2: 出入度維護for(int i = 0; i < prerequisites.length; i++) {in[prerequisites[i][0]]++;out.get(prerequisites[i][1]).add(prerequisites[i][0]);}// Part 3: 課程清除Deque<Integer> queue = new ArrayDeque<>(); for(int i = 0; i < in.length; i++) {if(in[i] == 0) {queue.offer(i);numCourses--;}}while(!queue.isEmpty()) {int pre = queue.poll();for(int temp : out.get(pre)) {if(--in[temp] == 0) {numCourses--;queue.offer(temp);}}}return numCourses == 0;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】207. 课程表(Java、图、BFS、队列)的全部內容,希望文章能夠幫你解決所遇到的問題。

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