什麼是 LeetCode 中的陣列嵌套?2025 DFS 最佳解決方案指南。
陣列嵌套乍看之下可能很複雜,但只要有正確的策略,它就會轉變成一個引人入勝的挑戰。本指南徹底研究 LeetCode 問題 565:陣列嵌套,全面探討如何使用深度先搜索 (DFS) 解決該問題。我們將透過問題描述、解釋為何 DFS 是一種有效的方法、分解演算法、提供詳細的程式碼範例,並討論最佳化策略。最後,您將對陣列嵌套和 DFS 有堅實的了解,讓您有信心處理類似的問題。
重點
掌握 LeetCode 上的陣列嵌套問題說明 (問題 565)。
瞭解為什麼深度第一搜尋 (DFS) 非常適合辨識陣列內的循環。
將 DFS 演算法解構為清楚、易於管理的步驟。
檢閱 Java 和 Python 程式碼實作。
分析時間和空間複雜性的考慮因素。
探索最佳化方法,例如使用訪問的陣列。
跟隨一個循序漸進的範例來強化您的理解能力。
瞭解陣列嵌套
問題說明:LeetCode 565
讓我們從問題的正式定義開始。給你一個包含 'n「 個整數的陣列 」nums「,其中每個值 」nums[i]' 都在 [0, n - 1] 的範圍內。這個陣列代表從 0 到 n-1 的數字的排列。您的目標是確定按照此序列所形成的最長集合(或週期)的長度:
- 從任何索引 'i' 開始。
- 集合中隨後的元素是 'nums[i]'。
- 之後的元素是 'nums[nums[i]]',然後繼續這個模式。
- 這個過程一直持續,直到您遇到目前集合中已經遇到的元素為止。
目標是返回在陣列中找到的最大這類集合的長度。這個問題考驗您瀏覽陣列結構和識別循環模式的能力。
為什麼深度第一搜尋 (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' 陣列。
基本情況:如果visited
[i
]已經為真,表示這個元素是我們已經測量過
的循環的
一部分。

Mark as Visited:我們立即將 visited[i]標記為 true,以防止從不同的起點重新進入相同的循環
:
計算循環長度:循環的總長度是 1 (目前節點的長度) 加上遞歸呼叫所傳回的長度。然後返回這個值。cycle_length = 1 + dfs(nums, next, visited).
The Main Function (arrayNesting(nums))
- 初始化 'visited' 陣列:
- 初始化 'maxLength' 為 0:此變數將追蹤找到的最長週期
- :遍歷 'nums「 陣列中的每個索引 」i'
- :
- 更新 'maxLength':
max_length = Math.max(max_length,dfs(nums,i,visited)). - 返回 'maxLength':處理所有索引後,回傳
maxLength 的最終值。
pricingtitlepricingDFS
方法
的優缺點優點
有效的週期偵測:非常適合在類圖結構(如此陣列)中尋找週期
:
系統化遍歷:
保證充分探索每個潛在路徑和循環:
清晰的遞迴結構:遞迴性質為解決問題提供了直接、合乎邏輯的流程。
缺點
堆疊溢出的
可能性
:對於非常大的輸入大小,深度遞歸可能會導致堆疊滿溢錯誤
:
使用 DFS
解決陣列巢狀問題
的核心功能與優點主要
程式
碼概念及其幫助
解決陣列巢狀問題的 DFS 實作包含幾個重要的程式設計概念,這些概念有助於其成功:
- 遞歸:遞歸
:- DFS 的遞歸特性允許它充分探索
- 陣列
- 中的每個潛在路徑,確保不會遺漏任何循環:
- 這個陣列是提高效率的根本,可防止演算法多次處理任何元素
- :當演算法嘗試造訪已是目前遍歷路徑一部分的節點時,演算法會偵測到循環
- :
動態- 循環長度計算:每個循環的長度會在 DFS 陣列進行時即時計算
- :最大化
步驟
:
- 持續更新最大長度,確保最終答案是找到的最大週期。
透過程式碼範例增進理解為
說明 DFS 過程,請考慮以下範例:
給予陣列nums = [5,4,0,3,1,6,2],DFS 演算法的執行方式如下:
- 從索引 0 開始,標記索引 0 為已到訪,並繼續到
nums[0] 的值,也就是 5。 - 從索引 5 開始,將索引 5 標記為已到訪,並移至
nums[5],即 6。 - 從索引 6 開始,將索引 6 標記為已到訪,並移至
nums[6],即 2。 - 在索引 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這些實作經過最佳化,可以有效率地偵測週期並計算其長度,使用訪問的陣列來避免不必要的重新處理。
相關文章
在OpenAI和Anthropic之後,亞馬遜啟動新的10億美元FDE組織
隨著企業努力應對人工智慧整合問題,它們正轉向外部專家,促使服務提供商建立專門團隊以確保成功實施。週二,亞馬遜網路服務(AWS)宣佈成立一個新的內部部門,專門負責面向人工智慧的前置部署工程師。這些工程師將嵌入客戶組織中,以部署專門設計的智慧體,優先考慮快速部署,並賦予客戶獨立運營的能力。在宣佈該新部門的帖子中,AWS前沿人工智慧副總裁Francessca Vasquez強調,該部門的工作不僅僅是構建和維護請求的系統。“客戶在離開AWS FDE部署時,不僅獲得了新的解決方案,還獲得了新的工程能力
白宮放棄“超級智慧”的AI標籤
正在載入播放器……本週,白宮召集了幾乎所有主要科技公司的執行長齊聚一堂——包括扎克伯格、貝索斯、馬斯克以及 Anthropic 的達里奧·阿莫迪——簽署了一份人工智慧安全承諾,美國總統唐納德·特朗普稱該承諾“具有道德約束力”。特朗普還簽署了一項行政命令,正式將人工智慧重新定義為“超級智慧”,與此同時,Meta 和 OpenAI 正致力於使其人工智慧產品更加使用者友好,儘管來自企業部門的人工智慧最大金融投資仍在持續湧入。在本期 TechCrunch 的 Equity 播客節目中,Kirste
亞馬遜運用人工智慧與潔淨能源推動資料中心擴建
亞馬遜運用人工智慧、核能及電動車,在擴展基礎設施的同時降低碳強度。圖片來源:亞馬遜亞馬遜的《2025年永續發展報告》詳述了這家科技巨頭如何整合人工智慧與核能投資,在擴展全球基礎設施的同時降低碳排放。根據亞馬遜《2025年永續發展報告》,該公司全球營運所消耗的電力已連續第三年100%由再生能源供應。該公司透過其零碳能源組合實現此目標,該組合包含 712 個專案,總容量達 42GW,以支援資料中心的全
相關專題推薦
評論 (1)
0/500
陣列嵌套乍看之下可能很複雜,但只要有正確的策略,它就會轉變成一個引人入勝的挑戰。本指南徹底研究 LeetCode 問題 565:陣列嵌套,全面探討如何使用深度先搜索 (DFS) 解決該問題。我們將透過問題描述、解釋為何 DFS 是一種有效的方法、分解演算法、提供詳細的程式碼範例,並討論最佳化策略。最後,您將對陣列嵌套和 DFS 有堅實的了解,讓您有信心處理類似的問題。
重點
掌握 LeetCode 上的陣列嵌套問題說明 (問題 565)。
瞭解為什麼深度第一搜尋 (DFS) 非常適合辨識陣列內的循環。
將 DFS 演算法解構為清楚、易於管理的步驟。
檢閱 Java 和 Python 程式碼實作。
分析時間和空間複雜性的考慮因素。
探索最佳化方法,例如使用訪問的陣列。
跟隨一個循序漸進的範例來強化您的理解能力。
瞭解陣列嵌套
問題說明:LeetCode 565
讓我們從問題的正式定義開始。給你一個包含 'n「 個整數的陣列 」nums「,其中每個值 」nums[i]' 都在 [0, n - 1] 的範圍內。這個陣列代表從 0 到 n-1 的數字的排列。您的目標是確定按照此序列所形成的最長集合(或週期)的長度:
- 從任何索引 'i' 開始。
- 集合中隨後的元素是 'nums[i]'。
- 之後的元素是 'nums[nums[i]]',然後繼續這個模式。
- 這個過程一直持續,直到您遇到目前集合中已經遇到的元素為止。
目標是返回在陣列中找到的最大這類集合的長度。這個問題考驗您瀏覽陣列結構和識別循環模式的能力。
為什麼深度第一搜尋 (DFS) 非常適合
深度優先搜尋 (DFS) 對於涉及循環偵測的問題是一種直覺而有效的策略。您可以將陣列概念化為有向圖,其中每個索引都會引導您到另一個索引。DFS 善於有系統地探索這種圖形,在回溯之前盡可能沿著每個分支遍歷。以下是它在陣列嵌套上運作良好的主要原因:
- 有系統的探索:DFS 在移動到下一個路徑之前,會徹底探索每個潛在路徑,以確保完整遍歷任何循環。
- 循環偵測:如果在遍歷過程中遇到目前路徑中已經訪問過的節點,就表示您已經成功找出一個循環。跟蹤已訪問節點對此至關重要。
- 效率:透過標記已到訪節點,我們可以避免多餘的計算,優化整體解決方案。
替代方案
替代方案 1:DFS 的迭代實作
這種深度第一搜尋的迭代方式提供了遞歸的替代方案。以下的 Java 程式碼偵測循環並計算其長度,而不使用遞歸,因此避免了潛在的堆疊溢出問題:
這個實作的主要優點是: 方法直接在輸入陣列中計算週期 ,提供了更節省記憶體的解決方案。下面的 Python 程式碼示範了這個就地方法: 此方法的 優點包括: 我們使用一個名為 'visited「 的布林陣列,其長度與 」nums' 陣列相同。一旦我們在任何循環中探索了索引 'i' 處的元素, 這個遞迴函數接受 'nums「 陣列、起始索引 」i「 和 」visited' 陣列。 基本情況:如果 [i 的循環的 一部分。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:就地計算週期長度此
長度
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[i]的值就會被設定為 true。DFS 函數 (dfs(nums, i, visited))
visited]已經為真,表示這個元素是我們已經測量過
Mark as Visited:我們立即將 visited[i]標記為 true,以防止從不同的起點重新進入相同的循環
:
計算循環長度:循環的總長度是 1 (目前節點的長度) 加上遞歸呼叫所傳回的長度。然後返回這個值。cycle_length = 1 + dfs(nums, next, visited).
The Main Function (arrayNesting(nums))
- 初始化 'visited' 陣列:
- 初始化 'maxLength' 為 0:此變數將追蹤找到的最長週期
- :遍歷 'nums「 陣列中的每個索引 」i'
- :
- 更新 'maxLength':
max_length = Math.max(max_length,dfs(nums,i,visited)). - 返回 'maxLength':處理所有索引後,回傳
maxLength 的最終值。
pricingtitlepricingDFS
方法
的優缺點優點
有效的週期偵測:非常適合在類圖結構(如此陣列)中尋找週期
:
系統化遍歷:
保證充分探索每個潛在路徑和循環:
清晰的遞迴結構:遞迴性質為解決問題提供了直接、合乎邏輯的流程。
缺點
堆疊溢出的
可能性
:對於非常大的輸入大小,深度遞歸可能會導致堆疊滿溢錯誤
:
使用 DFS
解決陣列巢狀問題
的核心功能與優點主要
程式
碼概念及其幫助
解決陣列巢狀問題的 DFS 實作包含幾個重要的程式設計概念,這些概念有助於其成功:
- 遞歸:遞歸
:- DFS 的遞歸特性允許它充分探索
- 陣列
- 中的每個潛在路徑,確保不會遺漏任何循環:
- 這個陣列是提高效率的根本,可防止演算法多次處理任何元素
- :當演算法嘗試造訪已是目前遍歷路徑一部分的節點時,演算法會偵測到循環
- :
動態- 循環長度計算:每個循環的長度會在 DFS 陣列進行時即時計算
- :最大化
步驟
:
- 持續更新最大長度,確保最終答案是找到的最大週期。
透過程式碼範例增進理解為
說明 DFS 過程,請考慮以下範例:
給予陣列nums = [5,4,0,3,1,6,2],DFS 演算法的執行方式如下:
- 從索引 0 開始,標記索引 0 為已到訪,並繼續到
nums[0] 的值,也就是 5。 - 從索引 5 開始,將索引 5 標記為已到訪,並移至
nums[5],即 6。 - 從索引 6 開始,將索引 6 標記為已到訪,並移至
nums[6],即 2。 - 在索引 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這些實作經過最佳化,可以有效率地偵測週期並計算其長度,使用訪問的陣列來避免不必要的重新處理。
在OpenAI和Anthropic之後,亞馬遜啟動新的10億美元FDE組織
隨著企業努力應對人工智慧整合問題,它們正轉向外部專家,促使服務提供商建立專門團隊以確保成功實施。週二,亞馬遜網路服務(AWS)宣佈成立一個新的內部部門,專門負責面向人工智慧的前置部署工程師。這些工程師將嵌入客戶組織中,以部署專門設計的智慧體,優先考慮快速部署,並賦予客戶獨立運營的能力。在宣佈該新部門的帖子中,AWS前沿人工智慧副總裁Francessca Vasquez強調,該部門的工作不僅僅是構建和維護請求的系統。“客戶在離開AWS FDE部署時,不僅獲得了新的解決方案,還獲得了新的工程能力
白宮放棄“超級智慧”的AI標籤
正在載入播放器……本週,白宮召集了幾乎所有主要科技公司的執行長齊聚一堂——包括扎克伯格、貝索斯、馬斯克以及 Anthropic 的達里奧·阿莫迪——簽署了一份人工智慧安全承諾,美國總統唐納德·特朗普稱該承諾“具有道德約束力”。特朗普還簽署了一項行政命令,正式將人工智慧重新定義為“超級智慧”,與此同時,Meta 和 OpenAI 正致力於使其人工智慧產品更加使用者友好,儘管來自企業部門的人工智慧最大金融投資仍在持續湧入。在本期 TechCrunch 的 Equity 播客節目中,Kirste
亞馬遜運用人工智慧與潔淨能源推動資料中心擴建
亞馬遜運用人工智慧、核能及電動車,在擴展基礎設施的同時降低碳強度。圖片來源:亞馬遜亞馬遜的《2025年永續發展報告》詳述了這家科技巨頭如何整合人工智慧與核能投資,在擴展全球基礎設施的同時降低碳排放。根據亞馬遜《2025年永續發展報告》,該公司全球營運所消耗的電力已連續第三年100%由再生能源供應。該公司透過其零碳能源組合實現此目標,該組合包含 712 個專案,總容量達 42GW,以支援資料中心的全





首頁






