565 .数组嵌套
给你一个整数数组,长度是[0,n - 1]范围内数字的排列。
你应该建立一个集合[k]={nums[k],nums[nums[k]],nums[nums[k]]],}遵守以下规则:
第一个元素ins[k]从选择elementnums[k]ofindex=k开始。
下一个元素ins[k]应该是benums[nums[k]],然后是nums[nums[nums[k]]]等等。
我们就在重复元素出现之前停止添加。
返回集合[k]的最长长度。
1、暴力求解方法: 时间复杂度高了 超时了
解决方案类{
公众号:
内部数组列表(矢量nums){ 0
//先用暴力法写这样写时间复杂度太高了相当于o(n^2)
int n=nums。size();
int len=INT _ MIN
for(int I=0;在;(一)
{
无序_ setint res
int索引=I;
while(!res.count(nums[index])
{
RES . insert(nums[索引]);
index=nums[index];
}
len=max(len,(int)RES . size());
}
返回透镜;
}
};
分析:暴力法是对nums中的每一个数字都作为起始数字开始进行数组嵌套嵌套
对于已经遍历过的数字就不需要让他作为开头进行遍历因为其之后的检索路径已经是之前的一个子集合
同时检索的过程中也不需要设置只需要存头数字如果当前数字和头数字一样那么就结束了
2、按照这两个思路 对代码进行优化 用一个dp数组进行存储
解决方案类{
公众号:
内部数组列表(矢量nums){ 0
//先用暴力法写这样写时间复杂度太高了相当于o(n^2)
int n=nums。size();
int len=INT _ MIN
无序_ setint dp//用于存储哪些结点已经访问过了
for(int I=0;在;(一)
{
int索引=I;
if(dp.count(索引))继续;
//DP。插入(索引);//没有访问存储当前路径
无序_ setint res
while(!res.count(nums[index])
{
RES . insert(nums[索引]);
dp.insert(索引);
index=nums[index];
}
len=max(len,(int)RES . size());
}
返回透镜;
}
};
3、取消存储数据的 res 直接存访问的头结点
解决方案类{
公众号:
内部数组列表(矢量nums){ 0
//先用暴力法写这样写时间复杂度太高了相当于o(n^2)
int n=nums。size();
int len=INT _ MIN
无序_ setint dp//用于存储哪些结点已经访问过了
for(int I=0;在;(一)
{
int索引=I;
if(dp.count(索引))继续;
//DP。插入(索引);//没有访问存储当前路径
int front=索引
int tmp _ len=1;
而(前面!=nums[index])
{
//RES . insert(nums[index]);
dp.insert(索引);
index=nums[index];
tmp _ len
}
len=max(len,tmp _ len);
}
返回透镜;
}
};
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/107447.html