565 数组嵌套(图论思想-求解所有环的最大长度)
1. 问题描述:
索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则。假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]... 以此类推,不断添加直到S出现重复的元素。
示例 1:
输入: A = [5,4,0,3,1,6,2]
输出: 4
解释:
A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.
其中一种最长的 S[K]:
S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}
提示:
N是[1, 20,000]之间的整数。
A中不含有重复的元素。
A中的元素大小在[0, N-1]之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/array-nesting
2. 思路分析:
首先需要理解题目的意思,我们可以先画一下图,可以发现抽象出来是一个图论的问题(题目中蕴含了图论的思想)。我们可以将数组中的每一个位置看成是图中的点,数组中的元素值表示当前位置对应的点到另外一个点存在联系,那么将这两个位置连一条边,并且每个点只有一条出边,因为A数组中的元素值为0~N-1,所以对于每个点也只有一条入边,所以对于图中每一个点都是入度 = 出度 = 1,而满足这种性质的一定是由若干个环组成的图,对于每一个集合对应着一个环,所以本质上求解的是所有环的最大长度。对于这道题目来说因为只有N条边,所以我们可以从前遍历当发现当前这个位置之前没有被遍历过说明是新的环的起点那么从当前位置开始遍历找到当前起点构成的整个环(当前位置被遍历过之后那么标记为-1),在求解环的长度的时候维护环的最大长度即可,最终每一个点只被遍历一次。
3. 代码如下:
from typing import Listclass Solution:def arrayNesting(self, nums: List[int]) -> int:res = 0for i in range(len(nums)):# s记录当前环的长度s = 0j = i# 找到了新的环的起点if nums[i] != -1:while nums[j] != -1:# next为环的下一个位置next = nums[j]s += 1# 当前位置被遍历过那么标记为-1nums[j] = -1j = nextres = max(res, s)return res
565 数组嵌套(图论思想-求解所有环的最大长度)相关推荐
- LeetCode 565. 数组嵌套
1. 题目 索引从0开始长度为N的数组A,包含0到N - 1的所有整数. 找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下 ...
- 使用分治思想求解最大子序列
本文使用分治思想求解一个整型数组中的最大子序列,该算法的时间复杂度为NlogN,使用千万级的数据量计算结果的时间不超过0.5s.该算法使用了分治的思想:求解最大子序列的问题可以理解为将整个数组分成左右 ...
- 第十二周项目4-利用遍历思想求解图问题(6-7)
/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十二周项目4-利用遍历思想求解图问题(6-7) 作 者:佟兴锋 完成日期: ...
- dart - 如何制作新数组嵌套排序映射
今天关注的人突然多了起来,为此继续更新今天的第二篇 dart - 如何制作新数组嵌套排序映射? 我有一个看起来像这样的数据块: var list = [{ id: '1', title: 'thing ...
- 2015年大二上-数据结构-图-1-(4)-利用遍历思想求解图问题(2)
1.最短路径 问题:求不带权连通图G中从顶点u到顶点v的一条最短路径. 附:测试用图结构 2.最远顶点 问题:求不带权连通图G中,距离顶点v最远的顶点k 附:测试用图结构 /* *Copyright ...
- VBA: 什么是多维数组:从4维数组说起。兼3维数组和数组嵌套的区别
结论: 本文涉及内容 从4维数组看对多维数组的认识 3维数组和数组嵌套的区别 以及3维数组与redim()的使用注意点 数组的dim arr1() 或 redim arr1() 数组可以dim 或者r ...
- 递归思想求解稀疏多项式的值
利用递归思想求解指数连续增长的多项式的值用的是的秦九昭算法,从最里面的一层乘到最外面的一层,这个算法的效率要比一个项一个项的算的算法高出10倍. 这里的思想同秦九昭算法基本一致,唯一的差别就是稀疏多项 ...
- JavaScript数组嵌套数组并求男生女生
数组嵌套数组并求男生女生 <script>//输出年龄19岁以上男生姓名和年级var arr = [['小兰', 19, '女', '大一'],['小花', 20, '女', '大二'], ...
- 数组中数组/嵌套对象数组的遍历操作
数组中数组/嵌套对象数组的遍历操作 总结以下方法 1.for i in arr (推荐) 2.arr.foreach(item=>{ item.foreach(item2=>{ } ) } ...
最新文章
- 让GBDT和GNN结合起来:Criteo AI Lab提出全新架构BGNN
- 特约专栏丨王耀南院士:人工智能赋能无人系统
- 多线程并发的解决方案 volatile synchronized notify notifyAll wait关键字分析
- 程序员日常工作中如何正确的偷懒?
- Delphi应用程序的调试(四)The Debug Inspector
- STM32F1笔记(六)独立看门狗IWDG
- 【JVM】javap命令行分析揭示boolean的本质的虚拟机指令
- 部署mysql MHA集群
- latex 基本用法(二)—— 矩阵(增广矩阵、长虚线)
- Druid连接池链接mysql错误提示:create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/bank, errorCode
- 300本计算机编程的经典书籍下载
- PostgreSQL在何处处理 sql查询之十四
- java开发简历模板下载,技术详细介绍
- 适合公司年会的4个热门互动小游戏
- 简历推荐_12位AI产品经理
- tradeblazer mysql_交易开拓者(TradeBlazer)上手指南
- 微信小程序+百度AI OCR二代身份证识别
- 分布式Ruby解决之道
- 「LOJ6482」LJJ爱数数
- 【学习机器学习】实验——聚类算法性能度量