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 ...
随机推荐
- JVM运行时内存区
JVM运行时内存区是如何划分的? 方法区(Method Area):存储类的字节码信息.常量池 堆区(Heap Area):存储对象 Java方法栈(Stack Area):所有方法运行时,会创建一 ...
- jmeter测试工具安装篇
安装jmeter之前需要安装Java环境 window系统安装java 下载jdk 安装前我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwo ...
- 安装ubuntu后的U盘(tf卡)恢复到之前的状态
sudo fdisk /dev/sdasudo mkfs.vfat /dev/sda 注意: sda是 disk的名字.不同的电脑可能不一样.
- java学习流程(java学习之路)
Java学习流程 Java SE(18-20天) 1.计算机基础 2.博客的重要性 3Java基础语法 4.流程控制和方法 5 .数组 6 .面向对象 7 .异常 8 .常用类 9 .集合框架 10 ...
- 2.9 系统IO
iostream: 输入流 cin; c 指代 character 输出流 cout, cerr(立即刷新缓冲区), clog(缓冲区满后刷新) 命名空间 访问方式 namespace NameSpa ...
- 什么叫SSH?原理详解。
SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务.传统远程登录或文件传输方式,例如Telnet.FTP,使用明文传输数据,存在很多的安全 ...
- 10 个常用的 JS 工具库,80% 的项目都在用!
Day.js 一个极简的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持一样, 但体积仅有2KB. npm install dayjs 基本用法 import ...
- 把VScode插件提示abc的提示给移到最后
把VScode插件提示abc的提示给移到最后 解决方法 打开设置,在搜索中输入editor.snippetSuggestions,然后将选项改为top,就可以解决了 top:就是将你插件提示放到最上面 ...
- git 与远程仓库关联返回 fatal: remote origin already exists 解决方法
今天领导新建了一个代码仓库,我按照流程一步步推送代码,结果到了关联仓库的时候,返回 fatal: remote origin already exists(远程源已经存在) 下面是解决方法 1.删除远 ...
- PLSQL REPLACE 函数替换操作
oracle REPLACE 函数是用另外一个值来替代串中的某个值. 例如,可以用一个匹配数字来替代字母的每一次出现. REPLACE 的格式如下: REPLACE ( char, search_st ...