課程表系列(BFS)

廣度優先搜索

文章目錄

  • 廣度優先搜索
    • 207. 課程表
    • 210. 課程表 II
      • 思路
    • 630. 課程表 III
    • 1462. 課程表 IV
    • 547. 省份數量

207. 課程表

207. 課程表

你這個學期必須選修 numCourses 門課程,記為 0numCourses - 1

在選修某些課程之前需要一些先修課程。 先修課程按數組 prerequisites 給出,其中 prerequisites[i] = [ai, bi] ,表示如果要學習課程 ai必須 先學習課程 bi

  • 例如,先修課程對 [0, 1] 表示:想要學習課程 0 ,你需要先完成課程 1

請你判斷是否可能完成所有課程的學習?如果可以,返回 true ;否則,返回 false

示例 1:

輸入:numCourses = 2, prerequisites = [[1,0]]
輸出:true
解釋:總共有 2 門課程。學習課程 1 之前,你需要完成課程 0 。這是可能的。

示例 2:

輸入:numCourses = 2, prerequisites = [[1,0],[0,1]]
輸出:false
解釋:總共有 2 門課程。學習課程 1 之前,你需要先完成課程 0 ;并且學習課程 0 之前,你還應先完成課程 1 。這是不可能的。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> list=new ArrayList<List<Integer>>();//鄰接表存圖for(int i=0;i<numCourses;i++)list.add(new ArrayList<>());int[] indeg=new int[numCourses];//入度數組,下標對應結點for(int i=0;i<prerequisites.length;i++){list.get(prerequisites[i][0]).add(prerequisites[i][1]);//創建鄰接表indeg[prerequisites[i][1]]++;//入度+1}Queue<Integer> queue=new LinkedList<>();//遍歷時,用于存每個結點的隊列,這里的結點形式是在鄰接表中對應的下標//尋找入度為0的結點,當作起點加入隊列中for(int i=0;i<numCourses;i++){if(indeg[i]==0)queue.add(i);}//bfs部分while(!queue.isEmpty()){//將出度為0的結點全部出隊for(int i=queue.size();i>0;i--){//獲取結點的下標,并出隊Integer node=queue.poll();//遍歷該結點到達了哪些結點,并將那些結點入度-1;for(Integer j:list.get(node)){indeg[j]--;//可以學習該課程了,入隊if(indeg[j]==0){queue.add(j);}}}}//最后判斷入度數組是否全為0for(int i=0;i<numCourses;i++){if(indeg[i]!=0)return false;}return true;}
}

210. 課程表 II

210. 課程表 II

現在你總共有 numCourses 門課需要選,記為 0numCourses - 1。給你一個數組 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在選修課程 ai必須 先選修 bi

  • 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示:[0,1]

返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回 任意一種 就可以了。如果不可能完成所有課程,返回 一個空數組

示例 1:

輸入:numCourses = 2, prerequisites = [[1,0]]
輸出:[0,1]
解釋:總共有 2 門課程。要學習課程 1,你需要先完成課程 0。因此,正確的課程順序為 [0,1]

思路

本題與課程表1很相似,唯一區別:只是改了學習箭頭反過來了,然后在層序遍歷的同時將遍歷的結點存起來

class Solution {public int[] findOrder(int numCourses, int[][] prerequisites) {List<List<Integer>> list=new ArrayList<List<Integer>>();//鄰接表存圖int[] res=new int[numCourses];//學習課程順序for(int i=0;i<numCourses;i++)list.add(new ArrayList<>());int[] indeg=new int[numCourses];//入度數組,下標對應結點for(int i=0;i<prerequisites.length;i++){list.get(prerequisites[i][1]).add(prerequisites[i][0]);//創建鄰接表indeg[prerequisites[i][0]]++;//入度+1}Queue<Integer> queue=new LinkedList<>();//遍歷時,用于存每個結點的隊列,這里的結點形式是在鄰接表中對應的下標//尋找入度為0的結點,當作起點加入隊列中for(int i=0;i<numCourses;i++){if(indeg[i]==0)queue.add(i);}//bfs部分int index=0;while(!queue.isEmpty()){//將出度為0的結點全部出隊for(int i=queue.size();i>0;i--){//獲取結點的下標,并出隊Integer node=queue.poll();res[index++]=node;//遍歷該結點到達了哪些結點,并將那些結點入度-1;for(Integer j:list.get(node)){indeg[j]--;//可以學習該課程了,入隊if(indeg[j]==0){queue.add(j);}}}}for(int i=0;i<numCourses;i++){if(indeg[i]!=0)return new int[]{};}return res;}
}

630. 課程表 III

630. 課程表 III

這里有 n 門不同的在線課程,按從 1n 編號。給你一個數組 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 門課將會 持續durationi 天課,并且必須在不晚于 lastDayi 的時候完成。

你的學期從第 1 天開始。且不能同時修讀兩門及兩門以上的課程。

返回你最多可以修讀的課程數目。

示例 1:

輸入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
輸出:3
解釋:
這里一共有 4 門課程,但是你最多可以修 3 門:
首先,修第 1 門課,耗費 100 天,在第 100 天完成,在第 101 天開始下門課。
第二,修第 3 門課,耗費 1000 天,在第 1100 天完成,在第 1101 天開始下門課程。
第三,修第 2 門課,耗時 200 天,在第 1300 天完成。
第 4 門課現在不能修,因為將會在第 3300 天完成它,這已經超出了關閉日期。
import java.util.Arrays;
import java.util.PriorityQueue;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int scheduleCourse(int[][] courses) {Arrays.sort(courses,(a,b)->a[1]-b[1]);PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a);//耗時時間從大到小進行排序int s=0;for(int[] a:courses){int b=a[0],e=a[1];queue.add(b);s+=b;while(s>e){s-=queue.poll();}}return queue.size();}
}

1462. 課程表 IV

1462. 課程表 IV

你總共需要上 numCourses 門課,課程編號依次為 0numCourses-1 。你會得到一個數組 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想選 bi 課程,你 必須 先選 ai 課程。

  • 有的課會有直接的先修課程,比如如果想上課程 1 ,你必須先上課程 0 ,那么會以 [0,1] 數對的形式給出先修課程數對。

先決條件也可以是 間接 的。如果課程 a 是課程 b 的先決條件,課程 b 是課程 c 的先決條件,那么課程 a 就是課程 c 的先決條件。

你也得到一個數組 queries ,其中 queries[j] = [uj, vj]。對于第 j 個查詢,您應該回答課程 uj 是否是課程 vj 的先決條件。

返回一個布爾數組 answer ,其中 answer[j] 是第 j 個查詢的答案。

示例 1:

img

輸入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
輸出:[false,true]
解釋:課程 0 不是課程 1 的先修課程,但課程 1 是課程 0 的先修課程。

示例 2:

輸入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
輸出:[false,false]
解釋:沒有先修課程對,所以每門課程之間是獨立的。
import java.util.*;class Solution {public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {int[] indeg=new int[numCourses];List<Boolean> res=new ArrayList<>();Boolean[][] grid=new Boolean[numCourses][numCourses];List<List<Integer>> list = new ArrayList<List<Integer>>();//鄰接表存圖for (int i = 0; i < numCourses; i++) {list.add(new ArrayList<>());grid[i]=new Boolean[numCourses];Arrays.fill(grid[i],false);}for (int i = 0; i < prerequisites.length; i++) {list.get(prerequisites[i][0]).add(prerequisites[i][1]);indeg[prerequisites[i][1]]++;}Queue<Integer> queue = new LinkedList<>();//先將入度為0入隊for (int i = 0; i < numCourses; i++) {if (indeg[i] == 0)queue.add(i);}while (!queue.isEmpty()) {for (int i = queue.size(); i > 0; i--) {Integer node = queue.poll();for (Integer j : list.get(node)) {grid[node][j]=true;for(int k=0;k<numCourses;k++){grid[k][j]=grid[k][j] || grid[k][node];}indeg[j]--;if (indeg[j] == 0) queue.add(j);}}}for(int[] a:queries){res.add(grid[a[0]][a[1]]);}return res;}}

547. 省份數量

547. 省份數量

n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那么城市 a 與城市 c 間接相連。

省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。

給你一個 n x n 的矩陣 isConnected ,其中 isConnected[i][j] = 1 表示第 i 個城市和第 j 個城市直接相連,而 isConnected[i][j] = 0 表示二者不直接相連。

返回矩陣中 省份 的數量。

示例 1:

img

輸入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
輸出:2
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int findCircleNum(int[][] isConnected) {int n=isConnected.length;List<List<Integer>> grid=new ArrayList<>();//鄰接表//存圖for(int i=0;i<n;i++) {grid.add(new ArrayList<>());for (int j = 0; j < n; j++) {if (isConnected[i][j] == 1)grid.get(i).add(j);}}boolean[] visit=new boolean[n];int res=0;for(int i=0;i<n;i++){Queue<Integer> queue=new LinkedList<>();if(visit[i]==false){res++;visit[i]=true;queue.add(i);//bsf部分while(!queue.isEmpty()){Integer node=queue.poll();//遍歷該結點連接的結點for(Integer j:grid.get(node)){if(!visit[j])queue.add(j);visit[j]=true;}}}}return res;}
}

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

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

相關文章

c++11 標準模板(STL)(std::tuple)(三)

定義于頭文件 <tuple> template< class... Types > class tuple; (C11 起) 類模板 std::tuple 是固定大小的異類值匯集。它是 std::pair 的推廣。 若 (std::is_trivially_destructible_v<Types> && ...) 為 true &#xff0c;則 tuple 的析構函數是…

【AI繪畫】免費GPU Tesla A100 32G算力部署Stable Diffusion

免責聲明 在閱讀和實踐本文提供的內容之前&#xff0c;請注意以下免責聲明&#xff1a; 侵權問題: 本文提供的信息僅供學習參考&#xff0c;不用做任何商業用途&#xff0c;如造成侵權&#xff0c;請私信我&#xff0c;我會立即刪除&#xff0c;作者不對讀者因使用本文所述方法…

Matlab 機器人工具箱 RobotArm類

文章目錄 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官網:Robotics Toolbox - Peter Corke 1 RobotArm 串聯機械臂類 1.1 方法 方法描述plot顯示機器人的圖形表示teach驅動物理和圖形機器人mirror使用機器人作為從機來驅動圖形</

深入了解Kafka的文件存儲原理

Kafka簡介 Kafka最初由Linkedin公司開發的分布式、分區的、多副本的、多訂閱者的消息系統。它提供了類似于JMS的特性&#xff0c;但是在設計實現上完全不同&#xff0c;此外它并不是JMS規范的實現。kafka對消息保存是根據Topic進行歸類&#xff0c;發送消息者稱為Producer&…

IntelliJ IDEA 常用的插件

IntelliJ IDEA有很多常用的插件&#xff0c;這些插件可以擴展IDE的功能&#xff0c;提高開發效率。以下是一些常用的插件&#xff1a; Maven Helper&#xff1a;這是一款分析Maven依賴沖突的插件。在沒有此插件時&#xff0c;查看Maven的依賴樹和檢查依賴包沖突可能需要輸入命…

梯度下降算法(帶你 原理 實踐)

目錄 一、引言 二、梯度下降算法的原理 三、梯度下降算法的實現 四、梯度下降算法的優缺點 優點&#xff1a; 缺點&#xff1a; 五、梯度下降算法的改進策略 1 隨機梯度下降&#xff08;Stochastic Gradient Descent, SGD&#xff09; 2 批量梯度下降&#xff08;Batch…

LLM分布式訓練第一課(通訊原語)

這個系列作為TFLOPS和顯存消耗的續篇,今天開始正式連載 上一部地址: LLM 參數,顯存,Tflops? 訓練篇(5) (qq.com) 前一篇文章舉了65B模型的訓練所消耗的顯存的案例,如果把條件降低一點,我們看一下7B的模型需要多少顯存? 2byte的模型靜態參數權重(以16bit存儲) = 1…

(一)Python數據分析體系--九五小龐

課程地址&#xff1a;https://space.bilibili.com/387143299/channel/collectiondetail?sid554734 主要內容 知識體系 分析什么樣的數據 為什么使用Python做數據分析 Python近幾年的發展勢頭是有目共睹的&#xff0c;尤其是在科學計算&#xff0c;數據處理&#xff0c;A方面…

駕辰龍跨Llama持Wasm,玩轉Yi模型迎新春

今年新年很特別&#xff0c;AI工具添光彩。今天就來感受下最新的AI神器天選組合“WasmEdgeYi-34B”&#xff0c;只要短短三步&#xff0c;為這個甲辰龍年帶來一份九紫離火運的科技感。 環境準備 這次用的算力是OpenBayes提供的英偉達RTX_4090*1、24GB顯存、20核CPU、80GB內存…

產品營銷展示型wordpress外貿網站模板

工藝品wordpress外貿主題 簡約大氣的wordpress外貿主題&#xff0c;適合做工藝品進出品外貿的公司官網使用。 https://www.jianzhanpress.com/?p5377 餐飲設備wordpress外貿主題 簡潔的wordpress外貿主題&#xff0c;適合食品機械、餐飲設備公司使用。 https://www.jianzh…

Linux 開發工具vim、gcc/g++、makefile

目錄 Linux編輯器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 簡單vim配置 Linux編譯器-gcc/g 1、基本概念 2、程序翻譯的過程 3. gcc如何完成程序翻譯 4、動靜態庫 Linux項目自動化構建工具-make/Makefile 1、背景 2、…

【Qt學習筆記】(四)Qt窗口

Qt窗口 1 菜單欄1.1 創建菜單欄1.2 在菜單欄中添加菜單1.3 創建菜單項1.4 在菜單項之間添加分割線1.5 給菜單項添加槽函數1.6 給菜單項添加快捷鍵 2 工具欄2.1 創建工具欄2.2 設置停靠位置2.3 設置浮動屬性2.4 設置移動屬性2.5 添加 Action 3 狀態欄3.1 狀態欄的創建3.2 在狀態…

2024最新算法:冠豪豬優化算法(CPO)求解23個基準函數

一、冠豪豬優化算法 冠豪豬優化算法(Crested Porcupine Optimizer&#xff0c;CPO)由Mohamed Abdel-Basset等人于2024年提出&#xff0c;該算法模擬冠豪豬的四種不同保護機制&#xff1a;視覺、聽覺、氣味和物理攻擊。第一和第二防御技術&#xff08;視覺和聽覺&#xff09;反…

盤點 | IT行業哪些認證含金量高

微思網絡 廈門微思網絡 作為一名IT人員&#xff0c;誰沒考幾個證 ——值得考的證書擁有的特性 ? 獲政府、企業和從業者認可&#xff1b; ? 持證人數多&#xff0c;業內共識度高&#xff1b; ? 幫持證者加分&#xff0c;快速提薪。 系統網絡方向認證 01 華為認證 華為…

設計模式學習筆記 - 設計原則 - 7.DRY 原則及提高代碼復用性

前言 DRY 原則&#xff0c;英文描述為&#xff1a; Don’t Repeat Yourself。中文直譯&#xff1a;不要重復自己。將它應用在編程中&#xff0c;可理解為&#xff1a;不要寫重讀的代碼。 可能你認為&#xff0c;這個原則很簡單。只要兩段代碼長得一樣&#xff0c;那就是違反 …

【機器學習】包裹式特征選擇之遞歸特征消除法

&#x1f388;個人主頁&#xff1a;豌豆射手^ &#x1f389;歡迎 &#x1f44d;點贊?評論?收藏 &#x1f917;收錄專欄&#xff1a;機器學習 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共同學習、交流進…

電磁兼容(EMC):電解電容低阻如何選擇詳解

目錄 1 為何要選低阻電解電容 2 電解電容等效高頻等效電路 3 不同廠家ESR參數 4 高頻ESR特性 5 Low ESR鋁電解電容 1 為何要選低阻電解電容 在EMI超標時&#xff0c;將普通電解電容更換為低阻電解電容時&#xff0c;便通過了。這是因為低阻電解電容降低了功率回路的輻射電…

數字化轉型導師堅鵬:證券公司數字化轉型戰略、方法與案例

證券公司數字化轉型戰略、方法與案例 課程背景&#xff1a; 數字化轉型背景下&#xff0c;很多機構存在以下問題&#xff1a; 不清楚證券公司數字化轉型的發展戰略&#xff1f; 不知道證券公司數字化轉型的核心方法&#xff1f; 不知道證券公司數字化轉型的成功案例&am…

LLM 系列——BERT——論文解讀

一、概述 1、是什么 是單模態“小”語言模型&#xff0c;是一個“Bidirectional Encoder Representations fromTransformers”的縮寫&#xff0c;是一個語言預訓練模型&#xff0c;通過隨機掩蓋一些詞&#xff0c;然后預測這些被遮蓋的詞來訓練雙向語言模型&#xff08;編碼器…

【計算機網絡通信】計算機之間的局域網通信和互聯網通信方法(附Python和C#代碼)

文章目錄 前言一、局域網通信1.1 基本原理和方法1.1.1 獲取本地ip1.1.2 實現局域網內的廣播1.1.3 進行局域網通信 1.2 實現多客戶端連接1.3 Python源碼1.4 C#源碼1.5 可能存在的問題 二、互聯網通信2.1 實現原理2.1.1 內網穿透軟件2.1.2 實現互聯網通信 2.2 Python源碼2.3 C#源…