Leetcode 565.数组嵌套

数组嵌套

索引从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}

注意:

  1. N是[1, 20,000]之间的整数。
  2. A中不含有重复的元素。
  3. A中的元素大小在[0, N-1]之间。

思路

? nums[i]的值作为索引,查找第nums[i]的数,不断嵌套.

? 通过观察,能够发现所有的嵌套过程都会形成一个闭环,例题中A[0]会一直寻找到A[2],而A[2]的值为0,指向了A[0],任取一个数都是如此.

? 每遍历一个闭环,将其所有元素的值置位-1,防止重复遍历.

? 通过判断闭环长度,并取其中的最大值,即可获得结果.

 1 class Solution {
 2     public int arrayNesting(int[] nums) {
 3         int num, res = 1, count = 1, temp;
 4         for (int i = 0; i < nums.length; i++) {
 5             if (nums[i] != -1) {
 6                 num = nums[i];
 7                 while (num != i) {
 8                     temp = num;
 9                     num = nums[num];
10                     nums[temp] = -1;
11                     count++;
12                 }
13                 res = Math.max(res, count);
14                 count = 1;
15             }
16         }
17         return res;
18     }
19 }

原文地址:https://www.cnblogs.com/kexinxin/p/10381387.html

时间: 2024-10-11 19:30:04

Leetcode 565.数组嵌套的相关文章

leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

LeetCode:数组中的第K个最大元素【215】

LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 题目分析 我们主要来学习一个新的集合类型--优先队列.优先队列作用是保证每次取

[LeetCode] Array Nesting 数组嵌套

A zero-indexed array A consisting of N different integers is given. The array contains all integers in the range [0, N - 1]. Sets S[K] for 0 <= K < N are defined as follows: S[K] = { A[K], A[A[K]], A[A[A[K]]], ... }. Sets S[K] are finite for each K

leetcode之数组中找两数和为指定值

题目: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note t

Leetcode 164 数组最大间隔(线性复杂度实现)//Python

LeetCode 地址:https://leetcode.com/problems/maximum-gap/description/ 题目描述 给定一个未排序数组,找出排序后的元素之间的最大间隔. 要求用线性时间复杂度实现. 例如:输入为[3,6,9,1,10],输出应为最大间隔3. 题目分析 线性时间复杂度实现,就说明不能先对元素进行排序,因为采用此法复杂度为O(n?log(n)) 思路是采用桶排序的方法. 首先,求随机数组中的最大元素 , 最小元素,为线性时间复杂度: 然后,在最大元素和最小

leetcode关于数组的问题

[Leetcode] 628. 三个数的最大乘积 解题思路: 这个一开始我是没想到思路的(除了遍历),因为有正负号的问题,后来看了一下别人的思路然后自己写的,思路是这样的: 三个数乘积最大只能有两种情况, 一种是三个最大正数直接乘起来最大, 另一种就是两个最小的负数乘起来再乘以一个最大的正数. 第一步: 跟前面的那个414.第三大的数一个思路,遍历找到最大的三个正数和最小的两个数. 第二步: 比较最大三个数的乘积和两个最小数乘以最大数的乘积谁大就返回谁. leetcode414-第三大的数 解释

【LeetCode】数组--合并区间(56)

写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据.在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构. 贪心算法回顾: [LeetCode]贪心算法--买卖股票的最佳时机II(122) [LeetC

[LeetCode]215. 数组中的第K个最大元素(堆)

题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例?2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-ele

LeetCode 442.数组中重复的数据 - JavaScript

题目描述:给定一个整数数组 a,其中 1 ≤ a[i] ≤ n (n 为数组长度), 其中有些元素出现两次而其他元素出现一次. 找到所有出现两次的元素. 你可以不用到任何额外空间并在 O(n)时间复杂度内解决这个问题吗? 题目分析 这里的不使用任何额外空间,指的是不为哈希表开辟额外空间.最后要返回的元素,还是要放在数组内的. 解法 :原地哈希 因为不能使用额外空间存储哈希表,所以只能对数组本身做操作.题目提到元素的范围是 1 到 n,并且元素只可能出现 1 次或者 2 次. 因此这里可以使用符号