题目:数组嵌套


索引从0开始长度为N的数组A,包含0N - 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出现重复的元素。

提示:

N[1, 20,000]之间的整数。

A中不含有重复的元素。

A中的元素大小在[0, N-1]之间。

1.暴力解法

  • 遍历nums数组,遍历到每一个元素时创建一个unordered_set集合 S,再对当前遍历元素按规则 A[A[i]]... 嵌套查找是否元素已经存在于 集合S当中,不存在就插入集合内,存在就结束本次嵌套查找。
class Solution {
public:
int arrayNesting(vector<int>& nums) {
size_t max_size = 0;
int N = nums.size();
for(int i=0; i<N; ++i){
unordered_set<int> _set;
_set.insert(nums[i]);
max_size = max(max_size, _set.size()); //set插入元素后马上更新集合最大值
int j = nums[i];
while(j<N && !_set.count(nums[j]))
{
_set.insert(nums[j]);
j = nums[j];
max_size = max(max_size, _set.size());
}
}
return max_size;
}
};

时间复杂度:O(n2) 在处嵌套查找次数与A大小n相关

空间复杂度:O(n) 需要额外用到一个unordered_set

2.图

  • 题目表明A中不存在重复的元素,也就是说可以把嵌套查找A[A[i]]...看作对出度和入度为一有向图的遍历,且A所遍历的结果一定是一个或多个。如下图所示,从任意一个内的元素开始可以遍历整个,所以我们嵌套查找时访问到的元素就可以打上标记,之后A遍历到该元素时可以跳过;

class Solution {
public:
int arrayNesting(vector<int>& nums) {
int max_size = 0,N = nums.size();
for(int i=0;i<N;++i){ //①
int count = 0;
int j = i;
while(nums[j] < N){ //②
++count;
max_size = max(max_size, count);
int tmp = j;
j = nums[j];
nums[tmp] = N;
}
}
return max_size;
}
};

时间复杂度:O(n) 对A中每个元素最多遍历2n次,即 ①②两处各访问一次

空间复杂度:O(1) 不占用额外空间

参考

  1. https://leetcode.cn/problems/array-nesting/solution/shu-zu-qian-tao-by-leetcode-solution-7ur3/

LEETCODE 数组嵌套的更多相关文章

  1. Leetcode 565.数组嵌套

    数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则. 假设选 ...

  2. Java实现 LeetCode 565 数组嵌套(没有重复值的数组)

    565. 数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], - }且遵守以下的规则. ...

  3. go实现json数组嵌套

    go实现json数组嵌套 引用包 "encoding/json" 定义以下结构体 type person struct { Name string `json:"name ...

  4. Leetcode数组题*3

    目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加 ...

  5. localStorage中一个数组嵌套一个数组的怪相

    localStorage中一个数组嵌套一个数组的怪相 需求:向本地存储中循环添加对象 思路 : ​ 先完成点击事件中添加本地存储功能,当刷新时使用一个数组记录已经存储下来的数据,并在点击事件中将新生成 ...

  6. LeetCode 数组分割

    LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...

  7. LeetCode数组中重复的数字

    LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...

  8. js处理复杂数据格式数组嵌套对象,对象嵌套数组,reduce处理数据格式

    let list=[ {id:1,name:'a'}, {id:1,name:'b'}, {id:1,name:'c'}, {id:2,name:'A'}, {id:2,name:'B'}, {id: ...

  9. [LeetCode] Array Nesting 数组嵌套

    A zero-indexed array A consisting of N different integers is given. The array contains all integers ...

  10. [LeetCode] 565. Array Nesting 数组嵌套

    A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest ...

随机推荐

  1. 百题计划-1 codeforces1181C Flag 暴力模拟

    https://codeforces.com/contest/1181/problem/C 题意:给一个n*m的格子(n,m<=1000),每个格子有个颜色,求可以条纹子矩阵的数量. 条纹矩阵就 ...

  2. 没解决的问题-git连接失败

    [parallels@localhost ~]$ ssh-keygen -t rsa -C '1012144290@qq.com'Generating public/private rsa key p ...

  3. maven的setting.xml配置文件详解

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  4. 吴恩达老师机器学习课程chapter04——神经网络

    吴恩达老师机器学习课程chapter04--神经网络 本文是非计算机专业新手的自学笔记,高手勿喷,欢迎指正与其他任何合理交流. 本文仅作速查备忘之用,对应吴恩达(AndrewNg)老师的机器学期课程第 ...

  5. jubyter notebook 安装conda 虚拟环境

  6. 【C++复习】第九章 模板与群体数据(2)

    学习重点:容器类型内部的实现机制,顺便复习前面各章内容.容器类型的具体实现不需要特别关注(目前不需要会裸手写这么一个容器类型) 1.群体/线性群体 群体的概念 群体是指由多个数据元素组成的集合体.群体 ...

  7. MySQL之校对集问题

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  8. 跨时钟域之异步FIFO

    参考:https://www.cnblogs.com/aslmer/p/6114216.html 文章:Simulation and Synthesis Techniques for Asynchro ...

  9. CG3Y/ CG3Z 程序迁移

    /usr/sap/trans/cofiles/K900075.S4Q 固定值  文件目录(AL11)下去找 C:\Users\lenovo\Desktop\publici\K900075.S4Q /u ...

  10. laravel 软删除的使用

    1.模型层 引用类use Illuminate\Database\Eloquent\SoftDeletes;class类中引用软删除use SoftDeletes;然后执行正常的删除,列表已经不显示, ...