选项
首页
新闻
什么是 LeetCode 中的数组嵌套?2025 DFS 最佳解决方案指南。

什么是 LeetCode 中的数组嵌套?2025 DFS 最佳解决方案指南。

2025-11-29
141

数组嵌套乍看之下可能很复杂,但如果采用正确的策略,它就会变成一项引人入胜的挑战。本指南深入研究了 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:# 仅在该索引尚未被处理时继续start = 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

这种方法的

主要

优点包括:

  • 减少内存占用:通过修改原始列表,无需单独的访问数组
  • 访问元素直接在输入数组中标记
优化性能:
  • 这种方法最大限度地减少了内存分配和访问操作

访问数组 我们使用一个名为 "visited "的布尔数组,其长度与 "nums "数组相同。一旦我们在任何循环中探索了索引'i'处的元素,visited[i]值就会被设置为 true。

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

这个递归函数接受 "nums "数组、起始索引 "i "和 "visited "数组。

  1. 基本情况:如果visited[

i

  1. ]已为真,则表示该元素是我们已测量过

的循环的

  1. 一部分。

    1. 标记为已访问:我们会立即将visited[i]标记为 true,以防止从不同的起点重新进入同一循环

    2. 我们使用next = nums[i]确定下一个索引,然后递归调用dfs(nums,next,visited),继续探索循环

    3. 循环的总长度为 1(当前节点)加上递归调用返回的长度。cycle_length = 1 + dfs(nums,next,visited)

    主函数(arrayNesting(nums))

    1. 初始化 "visited "数组:
    2. 将 "maxLength "初始化为 0:该变量将跟踪找到的最长循环
    3. 遍历 "nums "数组中的每个索引 "i"
    4. 如果visited[i]为 false,则从该索引开始 DFS 遍历
    5. max_length = Math.max(max_length,dfs(nums,i,visited)).
    6. 返回 "maxLength":处理完所有索引后,返回maxLength 的最终值。

    DFS

    方法

    的优点和缺点优点

    有效的周期检测:非常适合在像数组这样的类图结构中查找循环

    清晰的递归结构:清晰的递归结构:递归性质为解决问题提供了直接的逻辑流程。

    缺点

    堆栈溢出的

    可能性

    :对于非常大的输入大小,深度递归可能会导致堆栈溢出错误

    使用 DFS

    解决数组嵌套问题

    的核心功能和优势主要

    代码概念及其帮助

    解决数组嵌套问题的 DFS 实现包含几个重要的编程概念,这些概念有助于其取得成功:

    • 递归:递归
    • DFS 的递归特性使其能够充分探索数组中的每一条潜在路径,确保不遗漏任何循环
    • 布尔访问
    • 数组:该数组是提高效率的基础,可防止算法对任何元素进行多次处理
    • 当算法试图访问已经是当前遍历路径一部分的节点时,算法会自动检测到循环
    • 动态循环长度计算
    • 当 DFS 在数组中前进时,每个循环的长度都会即时计算
    • 最大化
    步骤

    • 持续更新最大长度,确保最终答案是找到的最大循环。

    通过代码示例加深理解为了

    说明 DFS 的过程,请看下面的示例:

    给定数组nums = [5,4,0,3,1,6,2],DFS 算法的执行

    过程

    如下:

    1. 从索引 0 开始,标记索引 0 为已访问,并继续前进到nums[0] 的值,即 5。
    2. 索引 5 开始,将索引 5 标记为已访问,并移动到
    3. nums
    4. [5],即 6。
    5. 在索引 2 处,算法将其标记为已访问,并发现nums[2]为 0。由于 0 已被访问,因此循环 [0, 5, 6, 2] 已完成,长度为 4。

    算法正确

    识别

    最长循环

    。这种深度探索使得它可以很自然地检测到路径是否循环回到之前访问过的节点,从而形成循环。广度优先搜索(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# 示例 Usagenums = [5,4,0,3,1,6,2]solution = Solution()result = solution.arrayNesting(nums)print(f "Length of the longest cycle: {result}")# 输出:4这些实现经过优化,可以有效地检测周期并计算其长度,同时使用访问数组来防止不必要的重复处理。

    相关文章
    Meta 在用户强烈反对后取消了 AI 照片编辑功能 Meta 在用户强烈反对后取消了 AI 照片编辑功能 Meta,这家社交媒体巨头,再次卷入关于人工智能与用户隐私之间微妙平衡的公开辩论。据 TechCrunch 报道,Meta 的 Superintelligence Labs 本周早些时候推出了一款新的 AI 图像生成器 Muse Image。然而,一个备受好评的关键功能——允许用户通过“@”符号标记来修改和生成来自公开 Instagram 账户的图像——由于缺乏适当的通知机制,立即引发了用户以及 CAA 等机构的强烈反对。面对强烈的批评,Meta 迅速撤销了该决定,并于周五通过博客文章宣布将
    DeepMind首席执行官哈西里斯:我每天睡六个小时,通常在凌晨1点左右感到精力充沛。 DeepMind首席执行官哈西里斯:我每天睡六个小时,通常在凌晨1点左右感到精力充沛。 Fortune 最近刊登了对谷歌 DeepMind 首席执行官 Demis Hassabis 的采访,揭示了他对休息和生产力的非传统方法。Hassabis 透露,他睡眠时间非常少,将清醒时间划分为两个不同的工作阶段。关于他的睡眠习惯,Hassabis 表示:“我目标睡六小时,但我的习惯非同寻常。我可以在白天有效运作。”他强调,睡眠少于六小时会对大脑健康产生负面影响。Hassabis 于 2010 年联合创立了 DeepMind(后被谷歌收购),并因其在蛋白质结构预测方面的开创性工作荣获 20
    尽管营收未达预期,OpenAI与Anthropic仍在争夺市场份额 尽管营收未达预期,OpenAI与Anthropic仍在争夺市场份额 尽管近期有报道称OpenAI未达营收目标,给本周二的科技股带来压力,但私营人工智能实验室的投资者仍表现坚韧。经验丰富的投资者已确认,尽管媒体报道负面,他们仍不会减少投资。分析师认为当前的人工智能竞赛仍处于早期阶段,因此不会出现“赢家通吃”的局面。尽管高昂的计算成本给营收带来压力,但实验室可通过提高订阅费来提升盈利能力。行业格局正发生微妙变化与OpenAI不同,其竞争对手Anthropic获得了强有
    相关专题推荐
    视频创作 适用于 Reels、Shorts 及产品发布活动的 AI 短视频吸睛点生成器
    适用于 Reels、Shorts 及产品发布活动的 AI 短视频吸睛点生成器

    2026年最新最全的AI短视频开场白生成器,适用于Reels、Shorts及产品发布活动!XIX.AI精选了经过实际测试、效果惊人且必试的顶级工具,这些工具将彻底改变游戏规则。本页面每周更新,提供免费与付费版本的对比排名,助您找到提升内容创意和生产力的完美解决方案。 立即探索,释放您的AI优势!

    11 个工具
    xix.ai
    写作 适用于长篇写作的AI文章大纲工具
    适用于长篇写作的AI文章大纲工具

    2026年最新最佳、评分最高的人工智能文章大纲工具,专为长文写作打造!这份精心挑选的合集收录了功能强大、具有革命性意义的工具,它们能生成准确、结构清晰的大纲,并经过实际测试验证,可显著提升写作效率。XIX.AI 便是这份精英精选中的成员之一。 获取免费版与付费版的对比指南,助您选择最适合的工具。立即探索,释放您的AI优势!

    9 个工具
    xix.ai
    聊天机器人 用于语言练习、面试准备和日常流利度的最佳 AI 角色扮演聊天应用
    用于语言练习、面试准备和日常流利度的最佳 AI 角色扮演聊天应用

    2026 年最新最佳顶级评分 AI 角色扮演聊天应用,用于语言练习、面试准备和日常流利度!XIX.AI 精心策划了一个强大的变革性合集,提供免费与付费对比、真实世界测试以及每周更新的排名。这些必试工具可帮助您提升写作技能,克服流利度挑战,并提高所有日常场景下的沟通效率。立即探索,发现您语言成长的完美工具!

    10 个工具
    xix.ai
    音乐创作 用于混音制作、采样准备及卡拉OK母带处理的 AI 声部分离工具
    用于混音制作、采样准备及卡拉OK母带处理的 AI 声部分离工具

    2026年最新、最优秀且评分最高的AI音轨分离工具汇总,专为混音制作、采样准备以及卡拉OK音频处理而设计。这些功能强大的创新工具经过实际测试,能够实现精准的音频分离,显著提升工作效率。XIX.AI每周都会更新免费的付费产品对比指南,帮助您找到最适合自身需求的工具。立即探索,发挥您的AI优势。

    8 个工具
    xix.ai
    数据分析 用于收入看板、转化漏斗分析及产品指标分析的 AI SQL 助手
    用于收入看板、转化漏斗分析及产品指标分析的 AI SQL 助手

    2026年最新最优秀的AI SQL辅助工具排名揭晓!XIX.AI精心挑选了一系列功能强大的工具,这些工具会定期更新,并通过真实的场景测试来验证其性能。使用这些值得尝试的工具,您可以快速生成精准的收入分析报表、分析销售流程,并追踪产品各项指标,从而大幅提升工作效率。立即探索,找到最适合您的数据驱动决策工具!238个字符

    9 个工具
    xix.ai
    音乐创作 最佳用于歌曲草稿的 AI 旋律创作工具
    最佳用于歌曲草稿的 AI 旋律创作工具

    2026 年最新最佳顶级评分 AI 旋律创作工具,助力歌曲草稿创作!XIX.AI 精心策划了一套极具影响力且经过严格真实世界测试的变革性合集,旨在提供最佳的创作体验。您可以找到详细的免费与付费版对比、精准的排名以及必试选项,这些工具旨在帮助您轻松创作出令人惊艳的歌曲草稿,并显著提升您的创意生产力。立即探索,发现您的完美工具!

    8 个工具
    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