欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C C++ 題解LeetCode2360圖中的最長環(huán)示例

 更新時間:2022年10月18日 16:21:04   作者:Junkman丶  
這篇文章主要為大家介紹了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調試教程tasks.json和launch.json的設置

    vscode是一個輕量級的文本編輯器,但是它的擴展插件可以讓他拓展成功能齊全的IDE,這其中就靠的是tasks.json和launch.json的配置,下面這篇文章主要給大家介紹了關于超詳細VScode調試教程tasks.json和launch.json設置的相關資料,需要的朋友可以參考下
    2022-10-10
  • C語言源碼實現俄羅斯方塊

    C語言源碼實現俄羅斯方塊

    這篇文章主要為大家詳細介紹了C語言源碼實現俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Qt?timerEvent實現簡單秒表功能

    Qt?timerEvent實現簡單秒表功能

    這篇文章主要為大家詳細介紹了Qt?timerEvent實現簡單秒表功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++使用LibCurl實現Web隱藏目錄掃描功能

    C++使用LibCurl實現Web隱藏目錄掃描功能

    LibCurl是一個開源的免費的多協(xié)議數據傳輸開源庫,該框架具備跨平臺性,開源免費,并提供了包括HTTP、FTP、SMTP、POP3等協(xié)議的功能,本文將給大家介紹C++使用LibCurl實現Web隱藏目錄掃描功能
    2023-11-11
  • 詳解C語言中的預處理命令

    詳解C語言中的預處理命令

    初學C語言的時候,我們會在開頭寫下一句話,#include<stdio.h>,這就是預處理命令,下面我們通過這篇文章來了解一下,感興趣的可以跟隨小編一起學習一下
    2022-12-12
  • Qt項目實戰(zhàn)之方塊游戲的實現

    Qt項目實戰(zhàn)之方塊游戲的實現

    這篇文章主要為大家詳細介紹了如何利用Qt實現簡易的方塊游戲,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • c語言實現整蠱朋友小程序(附源碼)

    c語言實現整蠱朋友小程序(附源碼)

    這篇文章主要給大家介紹了關于c語言實現整蠱朋友小程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C/C++中宏定義(#define)

    C/C++中宏定義(#define)

    #define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字符串,該標識符被稱為宏名,被定義的字符串稱為替換文本。接下拉通過本文給大家分享C/C++中宏定義(#define)知識,需要的朋友參考下
    2017-02-02
  • strings命令分析淺談Go和C++編譯時的一點小區(qū)別

    strings命令分析淺談Go和C++編譯時的一點小區(qū)別

    今天小編就為大家分享一篇關于strings命令分析淺談Go和C++編譯時的一點小區(qū)別,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++實現貪吃蛇游戲

    C++實現貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C++實現貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論