選項
首頁
新聞
什麼是 LeetCode 中的陣列嵌套?2025 DFS 最佳解決方案指南。

什麼是 LeetCode 中的陣列嵌套?2025 DFS 最佳解決方案指南。

2025-11-29
106

陣列嵌套乍看之下可能很複雜,但只要有正確的策略,它就會轉變成一個引人入勝的挑戰。本指南徹底研究 LeetCode 問題 565:陣列嵌套,全面探討如何使用深度先搜索 (DFS) 解決該問題。我們將透過問題描述、解釋為何 DFS 是一種有效的方法、分解演算法、提供詳細的程式碼範例,並討論最佳化策略。最後,您將對陣列嵌套和 DFS 有堅實的了解,讓您有信心處理類似的問題。

重點

掌握 LeetCode 上的陣列嵌套問題說明 (問題 565)。

瞭解為什麼深度第一搜尋 (DFS) 非常適合辨識陣列內的循環。

將 DFS 演算法解構為清楚、易於管理的步驟。

檢閱 Java 和 Python 程式碼實作。

分析時間和空間複雜性的考慮因素。

探索最佳化方法,例如使用訪問的陣列。

跟隨一個循序漸進的範例來強化您的理解能力。

瞭解陣列嵌套

問題說明:LeetCode 565

讓我們從問題的正式定義開始。給你一個包含 'n「 個整數的陣列 」nums「,其中每個值 」nums[i]' 都在 [0, n - 1] 的範圍內。這個陣列代表從 0 到 n-1 的數字的排列。您的目標是確定按照此序列所形成的最長集合(或週期)的長度:

  1. 從任何索引 'i' 開始。
  2. 集合中隨後的元素是 'nums[i]'。
  3. 之後的元素是 'nums[nums[i]]',然後繼續這個模式。
  4. 這個過程一直持續,直到您遇到目前集合中已經遇到的元素為止。

目標是返回在陣列中找到的最大這類集合的長度。這個問題考驗您瀏覽陣列結構和識別循環模式的能力。

為什麼深度第一搜尋 (DFS) 非常適合

深度優先搜尋 (DFS) 對於涉及循環偵測的問題是一種直覺而有效的策略。您可以將陣列概念化為有向圖,其中每個索引都會引導您到另一個索引。DFS 善於有系統地探索這種圖形,在回溯之前盡可能沿著每個分支遍歷。以下是它在陣列嵌套上運作良好的主要原因:

  • 有系統的探索:DFS 在移動到下一個路徑之前,會徹底探索每個潛在路徑,以確保完整遍歷任何循環。
  • 循環偵測:如果在遍歷過程中遇到目前路徑中已經訪問過的節點,就表示您已經成功找出一個循環。跟蹤已訪問節點對此至關重要。
  • 效率:透過標記已到訪節點,我們可以避免多餘的計算,優化整體解決方案。

替代方案

替代方案 1:DFS 的迭代實作

這種深度第一搜尋的迭代方式提供了遞歸的替代方案。以下的 Java 程式碼偵測循環並計算其長度,而不使用遞歸,因此避免了潛在的堆疊溢出問題:

import java.util.Arrays;class Solution {public int arrayNesting(int[] nums) {int n = nums.length;boolean[] visited = new boolean[n];int maxLength = 0;for (int start = 0; start

這個實作的主要優點是:

  • 堆疊溢出預防:迭代循環取代遞歸,消除堆疊深度的疑慮
  • 它繼續使用獨立的陣列來有效率地追蹤哪些元素已被處理

替代方案 2:就地計算週期長度此

方法直接在輸入陣列中計算週期

長度

,提供了更節省記憶體的解決方案。下面的 Python 程式碼示範了這個就地方法:

class Solution:def arrayNesting(self, nums: List[int]) -> int:n = len(nums)max_length = 0for i in range(n):if nums[i] != -1:# Proceed only if this index hasn't been processedstart = icount = 0while nums[start] != -1:next_index = nums[start]nums[start] = -1# 設定為 -1start = next_indexcount += 1max_length = max(max_length, count)return max_length# 範例 Usagenums = [5,4,0,3,1,6,2]solution = Solution()result = solution.arrayNesting(nums)print(f "Length of the longest cycle: {result}") # 輸出:4

此方法的

主要

優點包括:

  • 降低記憶體佔用量:它不需要透過修改原始清單來建立單獨的訪問陣列
  • 訪問的元素直接在輸入陣列中標記

DFS 演算法:

我們使用一個名為 'visited「 的布林陣列,其長度與 」nums' 陣列相同。一旦我們在任何循環中探索了索引 'i' 處的元素,visited[i]的值就會被設定為 true。

DFS 函數 (dfs(nums, i, visited))

這個遞迴函數接受 'nums「 陣列、起始索引 」i「 和 」visited' 陣列。

  1. 基本情況:如果visited

[i

  1. ]已經為真,表示這個元素是我們已經測量過

的循環的

  1. 一部分。

    1. Mark as Visited:我們立即將 visited[i]標記為 true,以防止從不同的起點重新進入相同的循環

    2. 計算循環長度:循環的總長度是 1 (目前節點的長度) 加上遞歸呼叫所傳回的長度。然後返回這個值。cycle_length = 1 + dfs(nums, next, visited).

    The Main Function (arrayNesting(nums))

    1. 初始化 'visited' 陣列:
    2. 初始化 'maxLength' 為 0:此變數將追蹤找到的最長週期
    3. 遍歷 'nums「 陣列中的每個索引 」i'
    4. 更新 'maxLength': max_length = Math.max(max_length,dfs(nums,i,visited)).
    5. 返回 'maxLength':處理所有索引後,回傳maxLength 的最終值。

    pricingtitlepricingDFS

    方法

    的優缺點優點

    有效的週期偵測:非常適合在類圖結構(如此陣列)中尋找週期

    系統化遍歷:

    保證充分探索每個潛在路徑和循環:

    清晰的遞迴結構:遞迴性質為解決問題提供了直接、合乎邏輯的流程。

    缺點

    堆疊溢出的

    可能性

    :對於非常大的輸入大小,深度遞歸可能會導致堆疊滿溢錯誤

    使用 DFS

    解決陣列巢狀問題

    的核心功能與優點主要

    程式

    碼概念及其幫助

    解決陣列巢狀問題的 DFS 實作包含幾個重要的程式設計概念,這些概念有助於其成功:

    • 遞歸:遞歸
    • DFS 的遞歸特性允許它充分探索
    • 陣列
    • 中的每個潛在路徑,確保不會遺漏任何循環:
    • 這個陣列是提高效率的根本,可防止演算法多次處理任何元素
    • 當演算法嘗試造訪已是目前遍歷路徑一部分的節點時,演算法會偵測到循環
    • 動態
    • 循環長度計算:每個循環的長度會在 DFS 陣列進行時即時計算
    • 最大化

    步驟

    • 持續更新最大長度,確保最終答案是找到的最大週期。

    透過程式碼範例增進理解為

    說明 DFS 過程,請考慮以下範例:

    給予陣列nums = [5,4,0,3,1,6,2],DFS 演算法的執行方式如下:

    1. 從索引 0 開始,標記索引 0 為已到訪,並繼續到nums[0] 的值,也就是 5。
    2. 從索引 5 開始,將索引 5 標記為已到訪,並移至nums[5],即 6。
    3. 從索引 6 開始,將索引 6 標記為已到訪,並移至nums[6],即 2。
    4. 在索引 2 處,演算法將它標記為已到訪,並發現nums[2] 為 0。由於 0 已經到訪,因此循環 [0, 5, 6, 2] 已經完成,長度為 4。

    演算法正確地識別出這是最長的循環。

    使用

    案例

    使用案例

    為什麼 DFS 比其他圖遍历演算法(如 BFS

    )更適合用

    於此問題?

    這種深入探索使它很自然地偵測到路徑是否循環到先前造訪過的節點,形成循環。廣度第一搜尋 (Breadth-First Search, BFS) 更適合尋找最短路徑,對於這項特定任務來說不太直覺。

    這個問題是否可以在不使用額外空間的情況下解決?

    是的,只要修改原始輸入陣列,就可以得到 O(1) 空間的解決方案。您可以直接在「nums」陣列中標記已訪問的索引,而不需要獨立的「已訪問」陣列,方法是將其值變更為像 -1 之類的哨兵值。

    陣列中的數字範圍 (0 到 n-1)

    解決方案有何影響?

    它保證陣列中的每個值都是陣列本身的有效索引。

    相關問題

    給定一個由 n 個整數組成的陣列 nums,其中 nums[i] 的範圍是 [0, n - 1],您能寫一個函數找出並傳回陣列中最長的週期嗎?請提供 Java 和 Python 的實作

    。以下是 Java 和 Python 中專為尋找最長週期長度而設計的實作: import java.util.Arrays;class Solution {public int arrayNesting(int[] nums) {int n = nums.length;boolean[] visited = new boolean[n];int maxLength = 0;for (int i = 0; i int:n = len(nums)visited = [False] * nmax_length = 0for i in range(n):if not visited[i]:max_length = max(max_length, self.dfs(nums, i, visited))return max_lengthdef dfs(self, nums: List[int], start: int, visited: List[bool]) -> int:if visited[start]:return 0visited[start] = Truenext_val = nums[start]cycle_length = 1 + self.dfs(nums, next_val, visited)return cycle_length# Example Usagenums = [5,4,0,3,1,6,2]solution = Solution()result = solution.arrayNesting(nums)print(f "Length of the longest cycle: {result}")# Output:4這些實作經過最佳化,可以有效率地偵測週期並計算其長度,使用訪問的陣列來避免不必要的重新處理。

    相關文章
    Canva 預計明年上市,轉型為以人工智慧驅動的設計生態系統 Canva 預計明年上市,轉型為以人工智慧驅動的設計生態系統 設計軟體獨角獸 Canva 計劃於明年正式啟動首次公開募股(IPO)程序,此舉標誌著該公司在推動 AI 轉型之際,已進入關鍵的資本收穫階段。據《The Information》報導,Canva 目前正對其設計平台進行全面技術升級,戰略重心也從傳統的創意工具供應商,轉向以 AI 驅動的內容創作生態系統。 為提升市場競爭力,Canva近期推出了一系列生成式AI功能,旨在降低個人用戶及小型企業的專業設計
    Hightouch 憑藉 AI 驅動的行銷工具,年經常性收入(ARR)突破 1 億美元 Hightouch 憑藉 AI 驅動的行銷工具,年經常性收入(ARR)突破 1 億美元 過去,行銷人員必須仰賴設計師和其他創意專家,才能為個人化的線上廣告活動製作圖片和影片。2024 年底,成立七年的新創公司 Hightouch 推出了一項由人工智慧驅動的服務,讓行銷專業人士能夠為達美樂、Chime、PetSmart 和 Spotify 等品牌生成客製化內容——無需品牌設計團隊或廣告代理商的介入。這項服務已證實極為成功。自 20 個月前推出其 AI 產品以來,Hightouch 表示
    Meta 簽署協議,採購數百萬顆亞馬遜 AI 處理器 Meta 簽署協議,採購數百萬顆亞馬遜 AI 處理器 亞馬遜已與 Meta 達成一項重要合作,再次仰賴其自行設計的晶片。亞馬遜週五證實,Meta 已同意部署數百萬顆 AWS Graviton 晶片,以滿足其日益增長的人工智慧需求。請注意,AWS Graviton 是一款基於 ARM 架構的 CPU(中央處理器,專為通用運算設計),而非 GPU(圖形處理器)。雖然 GPU 仍是訓練大型模型的首選晶片,但一旦模型訓練完成,基於這些模型建構的 AI 代理程
    相關專題推薦
    聊天機器人 最佳 AI 調情與對話訓練工具:即時提升社交魅力與自信
    最佳 AI 調情與對話訓練工具:即時提升社交魅力與自信

    在 XIX.AI 探索 2026 年最頂尖的 AI 調情與對話訓練工具。我們精心挑選、評價最高的精選清單,能助您即時建立社交魅力與自信。探索這些必試且能徹底改變遊戲規則的工具,並透過免費與付費版本的比較,以及每週更新的排行榜,立即解鎖您的社交優勢。

    10 個工具
    xix.ai
    代碼 最適合自動化單元測試的最佳AI工具:一鍵生成Jest、PyTest和JUnit測試用例
    最適合自動化單元測試的最佳AI工具:一鍵生成Jest、PyTest和JUnit測試用例

    探索2026年最新評選出的頂級AI工具,這些工具專為自動化單元測試而設計。我們精心挑選了那些功能強大、能夠改變開發流程的工具,它們能夠幫助您快速生成Jest、PyTest和JUnit測試用例。在XIX.AI平臺上,您可以免費檢視各種選項,並透過實際測試結果以及每週更新的排名來了解它們的優劣。立即利用這些AI工具,提升您的開發效率吧!

    10 個工具
    xix.ai
    數據分析 最佳 AI 數據可視化工具:從原始檔案自動生成互動式 BI 儀表板
    最佳 AI 數據可視化工具:從原始檔案自動生成互動式 BI 儀表板

    立即前往 XIX.AI,探索 2026 年最佳 AI 數據可視化工具。我們精心挑選的頂級工具清單,能協助您從原始檔案中即時自動生成強大且互動式的商業智慧儀表板。透過實際測試與每週更新的排行榜,比較免費與付費選項的差異。立即釋放您數據的潛力。

    10 個工具
    xix.ai
    社群媒體 適用於社群媒體的 AI 品牌套件:在所有管道上維持一致的品牌視覺形象
    適用於社群媒體的 AI 品牌套件:在所有管道上維持一致的品牌視覺形象

    探索 2026 年最適合社群媒體的 AI 品牌設計套件。XIX.AI 精心整理的清單收錄了備受好評、能徹底改變遊戲規則的工具,助您在所有管道上維持完美一致的品牌視覺形象。透過實際測試,比較免費與付費選項的差異。立即為您的品牌開啟視覺優勢。

    10 個工具
    xix.ai
    聊天機器人 最佳 AI 女友應用程式與角色扮演用 AI 伴侶工具(2026 年指南)
    最佳 AI 女友應用程式與角色扮演用 AI 伴侶工具(2026 年指南)

    探索 2026 年最新、評價最高的 AI 伴侶工具,體驗沉浸式的角色扮演與情感連結。XIX.AI 精心策劃的指南收錄了多款功能強大、顛覆傳統的應用程式,內容包含每週更新的排行榜、免費與付費版本的比較,以及實際使用測試。立即找到最適合您的選擇,開啟有意義的數位伴侶體驗。

    10 個工具
    xix.ai
    寫作 最佳 AI 仙俠與武俠助手:撰寫史詩級的修煉歷程與武術動作設計
    最佳 AI 仙俠與武俠助手:撰寫史詩級的修煉歷程與武術動作設計

    探索 2026 年最優秀的 AI 助手,助您創作史詩級仙俠與武俠故事。XIX.AI 精心挑選的清單收錄了備受好評、能徹底改變遊戲規則的工具,助您駕馭修煉進程與武術動作設計。透過實際測試,比較免費與付費選項的差異。釋放您的創作潛能,今天就開始動筆吧!

    10 個工具
    xix.ai
    評論 (1)
    0/500
    NicholasLewis
    NicholasLewis 2026-02-21 12:00:40

    Als ich das Problem gestern selbst probiert habe, habe ich ewig gebraucht. Aber die Erklärung hier, wie man mit DFS die optimalen zyklischen Muster findet, ist super nachvollziehbar. Hoffentlich kann ich das bei der nächsten Interview-Frage anwenden. 🤞

    OR