LEETCODE 数组嵌套
题目:数组嵌套
索引从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出现重复的元素。
提示:
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) 不占用额外空间
参考
LEETCODE 数组嵌套的更多相关文章
- Leetcode 565.数组嵌套
数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则. 假设选 ...
- Java实现 LeetCode 565 数组嵌套(没有重复值的数组)
565. 数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], - }且遵守以下的规则. ...
- go实现json数组嵌套
go实现json数组嵌套 引用包 "encoding/json" 定义以下结构体 type person struct { Name string `json:"name ...
- Leetcode数组题*3
目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加 ...
- localStorage中一个数组嵌套一个数组的怪相
localStorage中一个数组嵌套一个数组的怪相 需求:向本地存储中循环添加对象 思路 : 先完成点击事件中添加本地存储功能,当刷新时使用一个数组记录已经存储下来的数据,并在点击事件中将新生成 ...
- LeetCode 数组分割
LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...
- LeetCode数组中重复的数字
LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- 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: ...
- [LeetCode] Array Nesting 数组嵌套
A zero-indexed array A consisting of N different integers is given. The array contains all integers ...
- [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 ...
随机推荐
- Android 6.0动态添加权限(Finn_ZengYuan博客)
1,随着手机版本变高,各种权限也有所限制:以下代码可人性化添加动态权限: 权限工具类1,2,3,4: 1,FinnPermissionConfig.CLass package com.finn.too ...
- mysql开启root用户远程管理权限
来源:https://blog.csdn.net/qq_29670375/article/details/120590041 1.使用"mysql -uroot -proot"命令 ...
- Unity2018 用vs2017打开脚本时,不兼容不能加载工程
修改 <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion> 为 <TargetFrameworkVersi ...
- 超2T硬盘使用gpt分区及做成lvm
1.超过2T分区不能用fdisk了,用parted 分区格式化后对新的分区做lvm
- ubuntu添加新硬盘进行分区,并挂载到/home
ubuntu添加新硬盘,进行分区,并挂载到/home目录. 1.查看已有的磁盘,可以看到sdb还没有分区. > sudo fdisk -l 可以看到各个硬盘的设备名,一般以sda.sdb.sdc ...
- 如何把百度地图左边的搜索列表导出成excel里?
有很多人问我,怎么样能够快速的把BAIDU地图左边的搜索列表里的商家地图,电话,导出到EXCEL里. 我就开发了一个小软件,专门为快速的实现导出数据到EXCEL. 为了使用方便,已经将全国的所又省份, ...
- 5-6:实现多窗口之异常(AttributeError: 'list' object has no attribute 'click')
代码: #coding = utf-8 from selenium import webdriver import time ##############5-6:实现多窗口切换_start###### ...
- taobao.tbk.sc.newuser.order.get( 淘宝客-服务商-新用户订单明细查询 )
淘宝客订单表结构设计(mysql) CREATE TABLE `tbk_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `member_id` bi ...
- 《OKR源于英特尔和谷歌的目标管理利器》读书笔记
17年10月下旬至11月,因团队需要改变考核方式以及更好的服务业务,Q4将尝试OKR的方式进行考核,故阅读了此书,有些想法与笔记. OKR定义:OKR是一套严密的思考框架和持续的纪律要求,旨在确保员工 ...
- php 虚拟化 linux 入侵检测交作业 不要太nice
#inclide<iostream> using namespace std; int main() { cout<<"暂时自闭一会er"; }