题目:数组嵌套


索引从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. Android 6.0动态添加权限(Finn_ZengYuan博客)

    1,随着手机版本变高,各种权限也有所限制:以下代码可人性化添加动态权限: 权限工具类1,2,3,4: 1,FinnPermissionConfig.CLass package com.finn.too ...

  2. mysql开启root用户远程管理权限

    来源:https://blog.csdn.net/qq_29670375/article/details/120590041 1.使用"mysql -uroot -proot"命令 ...

  3. Unity2018 用vs2017打开脚本时,不兼容不能加载工程

    修改    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion> 为 <TargetFrameworkVersi ...

  4. 超2T硬盘使用gpt分区及做成lvm

    1.超过2T分区不能用fdisk了,用parted 分区格式化后对新的分区做lvm

  5. ubuntu添加新硬盘进行分区,并挂载到/home

    ubuntu添加新硬盘,进行分区,并挂载到/home目录. 1.查看已有的磁盘,可以看到sdb还没有分区. > sudo fdisk -l 可以看到各个硬盘的设备名,一般以sda.sdb.sdc ...

  6. 如何把百度地图左边的搜索列表导出成excel里?

    有很多人问我,怎么样能够快速的把BAIDU地图左边的搜索列表里的商家地图,电话,导出到EXCEL里. 我就开发了一个小软件,专门为快速的实现导出数据到EXCEL. 为了使用方便,已经将全国的所又省份, ...

  7. 5-6:实现多窗口之异常(AttributeError: 'list' object has no attribute 'click')

    代码: #coding = utf-8 from selenium import webdriver import time ##############5-6:实现多窗口切换_start###### ...

  8. taobao.tbk.sc.newuser.order.get( 淘宝客-服务商-新用户订单明细查询 )

    淘宝客订单表结构设计(mysql) CREATE TABLE `tbk_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `member_id` bi ...

  9. 《OKR源于英特尔和谷歌的目标管理利器》读书笔记

    17年10月下旬至11月,因团队需要改变考核方式以及更好的服务业务,Q4将尝试OKR的方式进行考核,故阅读了此书,有些想法与笔记. OKR定义:OKR是一套严密的思考框架和持续的纪律要求,旨在确保员工 ...

  10. php 虚拟化 linux 入侵检测交作业 不要太nice

    #inclide<iostream> using namespace std; int main() { cout<<"暂时自闭一会er"; }