题目:数组嵌套


索引从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. Ubuntu20.04 无网络标识,网卡显示network为UNCLAIMED。附回退内核方法

    ubuntu自动装完驱动后发现没有网络标识了,打开设置发现Network里边只有VPN,没有网卡的信息. 输入以下代码查看网络信息: sudo lshw -C network 发现输出"*- ...

  2. 嵌入式开发er的C语言能力自测(面试)题---top 16

    准备面试刷到的,链接里是原文和答案: (a-c-test-the-0x10-best-questions-for-would-be-embedded-programmers) 这里我先只给出问题,可以 ...

  3. C# snaps

    C# 启用 禁用 本地连接 1 static void Enable(string interfaceName) 2 { 3 System.Diagnostics.ProcessStartInfo p ...

  4. 普通java项目打成jar包,引入第三方jar .

    ja方法1 .  MANIFEST.MF 中添加  Class-Path . 1.  项目src目录下创建  META-INF/MANIFEST.MF 文件.文件内容 Manifest-Version ...

  5. 使用supervisor 管理 laravel 框架中的进程

    前言:在laravel中,经常要在项目根目录下执行 php artisan queue:work  来执行队列中的任务,由此,我们想到用supervisor来管理这个进程 Supervisor是用Py ...

  6. linux 查看端口号是否对外开放,并开放端口号

    查看对外开放的端口状态查询指定端口是否已开 firewall-cmd --query-port=8780/tcp 提示 yes,表示开启:no表示未开启. 对外开发端口 查看想开的端口是否已开:fir ...

  7. localStorage/sessionStorage/cookie

    html5本地存储主要有两种localStorage和sessionStorage        都是使用相同api,存入后都是字符串类型 localStorage和sessionStorage使用方 ...

  8. .Net Standard .Net Framework .Net Core 版本对应

  9. SQLSERVER 根据一个库的视图在另一个库中生成一张表

    select * into VPsiOuntStockBill from [KshDbPro].dbo.VPsiOuntStockBill

  10. [NepCTF2022]中学数学

    中学数学 p.q挣扎很久没分解出来,wp出来了赶紧复现试试. 题目 from gmpy2 import * from Crypto.Util.number import * from secret i ...