最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年10月18日 16:21:04   作者:Junkman丶  
這篇文章主要為大家介紹了C C++ 題解LeetCode2360圖中的最長(zhǎng)環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目描述

題目鏈接:2360. 圖中的最長(zhǎng)環(huán)

給你一個(gè) n 個(gè)節(jié)點(diǎn)的 有向圖 ,節(jié)點(diǎn)編號(hào)為 0 到 n - 1 ,其中每個(gè)節(jié)點(diǎn) 至多 有一條出邊。

圖用一個(gè)大小為 n 下標(biāo)從 0 開始的數(shù)組 edges 表示,節(jié)點(diǎn) i 到節(jié)點(diǎn) edges[i] 之間有一條有向邊。如果節(jié)點(diǎn) i 沒有出邊,那么 edges[i] == -1 。

請(qǐng)你返回圖中的 最長(zhǎng) 環(huán),如果沒有任何環(huán),請(qǐng)返回 -1 。

一個(gè)環(huán)指的是起點(diǎn)和終點(diǎn)是 同一個(gè) 節(jié)點(diǎn)的路徑。

提示:

示例 1:

輸入: edges = [3,3,4,2,3]
輸出去: 3
解釋: 圖中的最長(zhǎng)環(huán)是:2 -> 4 -> 3 -> 2 。
這個(gè)環(huán)的長(zhǎng)度為 3 ,所以返回 3 。 

示例 2:

輸入: edges = [2,-1,3,1]
輸出: -1
解釋: 圖中沒有任何環(huán)。 

整理題意

題目給定一張含有 n 個(gè)節(jié)點(diǎn)的 有向圖,且每個(gè)節(jié)點(diǎn) 至多 有一條出邊。

給定一個(gè)整數(shù)數(shù)組 edges,表示節(jié)點(diǎn) i 到節(jié)點(diǎn) edges[i] 之間有一條有向邊( i 指向 edges[i])。

規(guī)定如果節(jié)點(diǎn) i 沒有出邊,那么 edges[i] == -1 。

題目讓我們返回圖中 最長(zhǎng) 的環(huán),如果圖中不存在環(huán)返回 -1 。

解題思路分析

因?yàn)樵擃}所給的圖為有向圖,且每個(gè)節(jié)點(diǎn)至多只有一條出邊,我們可以從任意一個(gè)節(jié)點(diǎn)出發(fā),如果能夠到達(dá) 本輪 已經(jīng)遍歷過的節(jié)點(diǎn),那么說明能夠構(gòu)成一個(gè)新環(huán)。維護(hù)環(huán)的最大值即可。

具體實(shí)現(xiàn)

那么我們要怎么記錄遍歷過的節(jié)點(diǎn)是否為本輪遍歷過的節(jié)點(diǎn)呢?

  • 很容易想到每次都清空一遍標(biāo)記數(shù)組,但是因?yàn)轭}目數(shù)據(jù)范圍的原因,這樣做是會(huì)超時(shí)的。

正確做法:利用一個(gè)時(shí)間戳來表示每個(gè)節(jié)點(diǎn)是第幾個(gè)被遍歷到的,那么我們只需記錄本輪開始節(jié)點(diǎn)的時(shí)間戳,當(dāng)遇到已經(jīng)遍歷過的節(jié)點(diǎn)時(shí)判斷該節(jié)點(diǎn)的時(shí)間戳與本輪開始節(jié)點(diǎn)的時(shí)間戳大小關(guān)系即可:

  • 如果大于等于本輪開始節(jié)點(diǎn)的時(shí)間戳:說明是本輪遍歷到新的一個(gè)環(huán);
  • 否則僅僅表示遍歷到之前遍歷過的節(jié)點(diǎn),沒有構(gòu)成新的環(huán)(因?yàn)橹氨闅v過的節(jié)點(diǎn)如果有環(huán)也已經(jīng)記錄過了)

初始化環(huán)的最大值為 -1,期間不斷維護(hù)環(huán)的最大值即可,最后返回這個(gè)最大值即可。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(n),其中 n 為 edges 的長(zhǎng)度,也就是點(diǎn)的個(gè)數(shù)。
  • 空間復(fù)雜度:O(n)。

代碼實(shí)現(xiàn)

class Solution {
public:
    int longestCycle(vector<int>& edges) {
        int n = edges.size();
        // mp[i] = j 表示節(jié)點(diǎn) i 是第 j 個(gè)遍歷到的
        int mp[n];
        memset(mp, 0, sizeof(mp));
        int ans = -1;
        // k 進(jìn)行計(jì)數(shù)
        int k = 1;
        for(int i = 0; i < n; i++){
            // 從沒有遍歷過的點(diǎn)作為起點(diǎn)
            if(mp[i] == 0){
                int t = i;
                // 找到第一個(gè)遍歷過的節(jié)點(diǎn)
                while(mp[t] == 0){
                    mp[t] = k++;
                    t = edges[t];
                    if(t == -1) break;
                }
                // 利用時(shí)間戳計(jì)算環(huán)的長(zhǎng)度,取最大值
                if(t != -1 && mp[t] >= mp[i]){
                    ans = max(ans, k - mp[t]);
                }
            }
        }
        return ans;
    }
};

總結(jié)

  • 該題的核心思想為記錄每個(gè)節(jié)點(diǎn)被遍歷到的時(shí)間戳,通過 時(shí)間戳來實(shí)現(xiàn)找新環(huán)的邏輯。
  • 因?yàn)槭怯邢驁D且每個(gè)節(jié)點(diǎn)至多有一個(gè)出度,所以可以利用時(shí)間戳的方式來實(shí)現(xiàn),需要注意這個(gè)前提條件。

測(cè)試結(jié)果:

以上就是C C++ 題解LeetCode2360圖中的最長(zhǎng)環(huán)示例的詳細(xì)內(nèi)容,更多關(guān)于C C++ 圖中的最長(zhǎng)環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Qt QChart實(shí)現(xiàn)折線圖的繪制

    Qt QChart實(shí)現(xiàn)折線圖的繪制

    QChart是常用的圖表,這篇文章主要為大家詳細(xì)介紹了Qt如何利用QChart實(shí)現(xiàn)折線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • C語言實(shí)現(xiàn)稀疏矩陣

    C語言實(shí)現(xiàn)稀疏矩陣

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)稀疏矩陣的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 在VC中隱藏控制臺(tái)程序窗口的實(shí)現(xiàn)代碼

    在VC中隱藏控制臺(tái)程序窗口的實(shí)現(xiàn)代碼

    大家都知道,當(dāng)編寫一個(gè)win32 console application時(shí),當(dāng)運(yùn)行此類程序的時(shí)候默認(rèn)情況下會(huì)有一個(gè)類似dos窗口的console窗口,但是有的時(shí)候我們只想在程序中運(yùn)行一段功能代碼,不希望顯示這個(gè)console窗口,讓代碼執(zhí)行完畢之后程序自動(dòng)退出
    2013-04-04
  • Cocos2d-x人物動(dòng)作類實(shí)例

    Cocos2d-x人物動(dòng)作類實(shí)例

    這篇文章主要介紹了Cocos2d-x人物動(dòng)作類實(shí)例,本文用大量代碼和圖片講解Cocos2d-x中的動(dòng)作,代碼中同時(shí)包含大量注釋說明,需要的朋友可以參考下
    2014-09-09
  • C語言函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    C語言函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要通過C語言函數(shù)指針數(shù)組實(shí)現(xiàn)了計(jì)算器的功能,是一個(gè)很好而且流程詳細(xì)的小例子,感興趣的新手朋友們可以自己動(dòng)手也寫一遍
    2022-04-04
  • C++連接mysql數(shù)據(jù)庫(kù)(改進(jìn)版)

    C++連接mysql數(shù)據(jù)庫(kù)(改進(jìn)版)

    C++是大家都非常熟悉的,也是大家平時(shí)辦公中經(jīng)常會(huì)用到的,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 講解C++編程中Address-of運(yùn)算符&的作用及用法

    講解C++編程中Address-of運(yùn)算符&的作用及用法

    這篇文章主要介紹了C++編程中Address-of運(yùn)算符&的作用及用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • VSCode配置C++環(huán)境的方法步驟(MSVC)

    VSCode配置C++環(huán)境的方法步驟(MSVC)

    這篇文章主要介紹了VSCode配置C++環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C++實(shí)現(xiàn)洗牌發(fā)牌排序功能的示例代碼

    C++實(shí)現(xiàn)洗牌發(fā)牌排序功能的示例代碼

    本篇文章主要介紹了C++實(shí)現(xiàn)洗牌發(fā)牌排序功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • C語言排序算法之選擇排序(直接選擇排序,堆排序)

    C語言排序算法之選擇排序(直接選擇排序,堆排序)

    這篇文章主要介紹了C語言排序算法之選擇排序(直接選擇排序,堆排序),堆排序使用堆來選數(shù),效率高很多,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

天长市| 延安市| 天镇县| 江都市| 泸州市| 吴忠市| 惠东县| 前郭尔| 东台市| 洛川县| 额济纳旗| 江门市| 霍州市| 固原市| 林西县| 淮阳县| 白河县| 黄骅市| 寻乌县| 房山区| 化德县| 沛县| 安乡县| 麦盖提县| 偏关县| 耒阳市| 固镇县| 蕉岭县| 醴陵市| 大名县| 天峨县| 峨边| 资阳市| 天台县| 农安县| 兰溪市| 济南市| 宣威市| 牡丹江市| 阿合奇县| 翁源县|