C C++ 題解LeetCode2360圖中的最長環(huán)示例
題目描述
題目鏈接:2360. 圖中的最長環(huán)
給你一個 n
個節(jié)點的 有向圖 ,節(jié)點編號為 0
到 n - 1
,其中每個節(jié)點 至多 有一條出邊。
圖用一個大小為 n
下標從 0
開始的數組 edges
表示,節(jié)點 i
到節(jié)點 edges[i]
之間有一條有向邊。如果節(jié)點 i
沒有出邊,那么 edges[i] == -1
。
請你返回圖中的 最長 環(huán),如果沒有任何環(huán),請返回 -1
。
一個環(huán)指的是起點和終點是 同一個 節(jié)點的路徑。
提示:
示例 1:
輸入: edges = [3,3,4,2,3]
輸出去: 3
解釋: 圖中的最長環(huán)是:2 -> 4 -> 3 -> 2 。
這個環(huán)的長度為 3 ,所以返回 3 。
示例 2:
輸入: edges = [2,-1,3,1]
輸出: -1
解釋: 圖中沒有任何環(huán)。
整理題意
題目給定一張含有 n
個節(jié)點的 有向圖,且每個節(jié)點 至多 有一條出邊。
給定一個整數數組 edges
,表示節(jié)點 i
到節(jié)點 edges[i]
之間有一條有向邊( i
指向 edges[i]
)。
規(guī)定如果節(jié)點 i
沒有出邊,那么 edges[i] == -1
。
題目讓我們返回圖中 最長 的環(huán),如果圖中不存在環(huán)返回 -1
。
解題思路分析
因為該題所給的圖為有向圖,且每個節(jié)點至多只有一條出邊,我們可以從任意一個節(jié)點出發(fā),如果能夠到達 本輪 已經遍歷過的節(jié)點,那么說明能夠構成一個新環(huán)。維護環(huán)的最大值即可。
具體實現
那么我們要怎么記錄遍歷過的節(jié)點是否為本輪遍歷過的節(jié)點呢?
- 很容易想到每次都清空一遍標記數組,但是因為題目數據范圍的原因,這樣做是會超時的。
正確做法:利用一個時間戳來表示每個節(jié)點是第幾個被遍歷到的,那么我們只需記錄本輪開始節(jié)點的時間戳,當遇到已經遍歷過的節(jié)點時判斷該節(jié)點的時間戳與本輪開始節(jié)點的時間戳大小關系即可:
- 如果大于等于本輪開始節(jié)點的時間戳:說明是本輪遍歷到新的一個環(huán);
- 否則僅僅表示遍歷到之前遍歷過的節(jié)點,沒有構成新的環(huán)(因為之前遍歷過的節(jié)點如果有環(huán)也已經記錄過了)
初始化環(huán)的最大值為 -1
,期間不斷維護環(huán)的最大值即可,最后返回這個最大值即可。
復雜度分析
- 時間復雜度:O(n),其中
n
為edges
的長度,也就是點的個數。 - 空間復雜度:O(n)。
代碼實現
class Solution { public: int longestCycle(vector<int>& edges) { int n = edges.size(); // mp[i] = j 表示節(jié)點 i 是第 j 個遍歷到的 int mp[n]; memset(mp, 0, sizeof(mp)); int ans = -1; // k 進行計數 int k = 1; for(int i = 0; i < n; i++){ // 從沒有遍歷過的點作為起點 if(mp[i] == 0){ int t = i; // 找到第一個遍歷過的節(jié)點 while(mp[t] == 0){ mp[t] = k++; t = edges[t]; if(t == -1) break; } // 利用時間戳計算環(huán)的長度,取最大值 if(t != -1 && mp[t] >= mp[i]){ ans = max(ans, k - mp[t]); } } } return ans; } };
總結
- 該題的核心思想為記錄每個節(jié)點被遍歷到的時間戳,通過 時間戳來實現找新環(huán)的邏輯。
- 因為是有向圖且每個節(jié)點至多有一個出度,所以可以利用時間戳的方式來實現,需要注意這個前提條件。
測試結果:
以上就是C C++ 題解LeetCode2360圖中的最長環(huán)示例的詳細內容,更多關于C C++ 圖中的最長環(huán)的資料請關注腳本之家其它相關文章!
相關文章
超詳細VScode調試教程tasks.json和launch.json的設置
vscode是一個輕量級的文本編輯器,但是它的擴展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關于超詳細VScode調試教程tasks.json和launch.json設置的相關資料,需要的朋友可以參考下2022-10-10strings命令分析淺談Go和C++編譯時的一點小區(qū)別
今天小編就為大家分享一篇關于strings命令分析淺談Go和C++編譯時的一點小區(qū)別,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04