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

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

2025-11-29
150

数组嵌套乍看之下可能很复杂,但如果采用正确的策略,它就会变成一项引人入胜的挑战。本指南深入研究了 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. 从
    3. 索引 5 开始,将索引 5 标记为已访问,并移动到
    4. nums
    5. [5],即 6。
    6. 在索引 2 处,算法将其标记为已访问,并发现nums[2]为 0。由于 0 已被访问,因此循环 [0, 5, 6, 2] 已完成,长度为 4。

    算法正确

    地

    将

    1. 其

    识别

    为

    最长循环

    。这种深度探索使得它可以很自然地检测到路径是否循环回到之前访问过的节点,从而形成循环。广度优先搜索(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这些实现经过优化,可以有效地检测周期并计算其长度,同时使用访问数组来防止不必要的重复处理。

    相关文章
    在OpenAI和Anthropic之后,亚马逊启动新的10亿美元FDE组织 在OpenAI和Anthropic之后,亚马逊启动新的10亿美元FDE组织 随着企业努力应对人工智能集成问题,它们正转向外部专家,促使服务提供商建立专门团队以确保成功实施。周二,亚马逊网络服务(AWS)宣布成立一个新的内部部门,专门负责面向人工智能的前置部署工程师。这些工程师将嵌入客户组织中,以部署专门设计的智能体,优先考虑快速部署,并赋予客户独立运营的能力。在宣布该新部门的帖子中,AWS前沿人工智能副总裁Francessca Vasquez强调,该部门的工作不仅仅是构建和维护请求的系统。“客户在离开AWS FDE部署时,不仅获得了新的解决方案,还获得了新的工程能力
    白宫放弃“超级智能”的AI标签 白宫放弃“超级智能”的AI标签 正在加载播放器……本周,白宫召集了几乎所有主要科技公司的首席执行官齐聚一堂——包括扎克伯格、贝索斯、马斯克以及 Anthropic 的达里奥·阿莫迪——签署了一份人工智能安全承诺,美国总统唐纳德·特朗普称该承诺“具有道德约束力”。特朗普还签署了一项行政命令,正式将人工智能重新定义为“超级智能”,与此同时,Meta 和 OpenAI 正致力于使其人工智能产品更加用户友好,尽管来自企业部门的人工智能最大金融投资仍在持续涌入。在本期 TechCrunch 的 Equity 播客节目中,Kirste
    亚马逊借助人工智能和清洁能源推动数据中心扩张 亚马逊借助人工智能和清洁能源推动数据中心扩张 亚马逊利用人工智能、核能和电动汽车来扩大基础设施规模,同时降低碳强度。图片来源:亚马逊亚马逊《2025年可持续发展报告》详细阐述了这家科技巨头如何整合人工智能和核能投资,在扩大全球基础设施规模的同时降低碳排放。根据亚马逊《2025年可持续发展报告》,该公司全球运营所消耗的电力已连续第三年100%由可再生能源满足。该公司通过其零碳能源组合实现了这一目标,该组合包含712个项目,总装机容量达42GW,
    相关专题推荐
    音乐创作 用于音乐创作的AI歌词创意工具
    用于音乐创作的AI歌词创意工具

    2026年最新、最受欢迎、评价最高的AI歌词创意工具现已登陆XIX.AI!这份精心精选的合集汇集了多款功能强大、颠覆性的工具,它们均经过实际测试,能够快速提供高质量的歌词创意,帮助用户激发创造力并优化音乐创作流程。 您还可以获取免费版与付费版的对比概览。立即探索,发现最适合您的工具!

    16 个工具
    xix.ai
    漫画创作 用于漫画世界构建的AI角色设定表工具
    用于漫画世界构建的AI角色设定表工具

    2026 年最新最佳顶级评分 AI 角色表工具,助力漫画世界构建,现已登陆 XIX.AI!本精选列表收录了经过严格现实测试的强大且具颠覆性的选项。您将看到免费与付费版本的对比,以及每周更新的排行榜,助您发掘那些能激发创意并简化世界构建任务的必备工具。立即探索,解锁您的 AI 优势!

    13 个工具
    xix.ai
    自动化 n8n 人工智能自动化工具,适用于内部运维、数据同步和多步骤代理流程
    n8n 人工智能自动化工具,适用于内部运维、数据同步和多步骤代理流程

    2026年最新最佳n8n AI自动化工具——适用于内部运营、数据同步和多步骤代理流程——现已发布!XIX.AI精心甄选了一系列广受好评、功能强大的颠覆性工具,可提升所有工作任务的生产力。 每款工具均经过严格的实际应用测试以确保可靠性,并附有详细的免费版与付费版对比分析及每周更新的排行榜。这些必试选项能助您发挥人工智能优势,轻松优化工作流程。立即探索,发现最适合您的工具!

    11 个工具
    xix.ai
    提示词 适合多模型团队的最佳提示词管理工具
    适合多模型团队的最佳提示词管理工具

    2026年最新最佳、评分最高的面向多模型团队的提示词管理工具! XIX.AI 精心精选了一系列功能强大、颠覆性的必试工具,提供免费与付费版本对比、实际应用测试及详细排名。这些广受好评的解决方案通过优化工作流程、消除重复劳动并在所有团队项目中激发创造力,能显著提升工作效率。立即探索,发现最适合您的工具,今天就开始创作吧!

    9 个工具
    xix.ai
    会议助理 适用于远程团队的 AI 会议摘要工具
    适用于远程团队的 AI 会议摘要工具

    2026年最新最受欢迎的远程团队AI会议摘要工具!XIX.AI精心挑选了一系列功能强大、颠覆性的必试工具,这些工具均经过实际测试,可提供准确的会议记录和可操作的洞察。 您将看到免费版与付费版的对比数据以及详细排名,助您挑选出最适合的方案,从而提升工作效率并优化团队沟通。立即探索,释放您的AI优势!

    13 个工具
    xix.ai
    软件开发 最佳 AI DevOps 辅助工具:监控部署、日志及故障事件
    最佳 AI DevOps 辅助工具:监控部署、日志及故障事件

    2026年最新、最优秀、评分最高的AI DevOps辅助工具汇总,专为监控部署流程、日志记录及故障处理而设计。XIX.AI通过实际应用测试与严格的评分体系,提供了极具突破性的强大工具,能够显著提升工作效率。您可以查看免费版与付费版的对比信息,找到最适合您工作流程的理想解决方案。立即探索,让AI优势助力您的业务发展。

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