前言
今天算法的内容是:深度优先搜索(主要看的深度优先搜索知识,要早睡,明天补上其余三道,其余三道与第一道思路相符)
一、 数组嵌套
索引从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出现重复的元素。
一、思路:
返回最长的数组长度深度优先搜索 每次都记录对比输出最长数组如何进行深度优先搜索 搜索 记录 对比 反复进行 输出最大值
(还不会吧 所以看题解吧骚年 这题的思路你是有的,你只是不会操作而已,慢慢来,记得题解写详细点哦~)
二、源码
class Solution {
//定义全局变量 Max Cnt
int Max,Cnt;
//定义全局哈希表
int hash[200010];
//为什么定义全局变量————方便调用
//
void dfs(vector<int>& nums,int u,int color) {
//作为bool数组进行 判断是否标记
//标记过进行再次循环 ,未标记进行下一步操作
if(hash[u] != -1) {
return ;
}
//对 当前结点进行标记 赋值
hash[u]=color;
//计数
++Cnt;
//进行递归调用
dfs(nums,nums[u],color);
}
public:
int arrayNesting(vector<int>& nums) {
int i;
int n=nums.size();
//用于 对搜索的数组进行 标记&赋值
int color=0;
Max=0;
memset(hash,-1,sizeof(hash));
//遍历n次
for(i=0;i<n;++i){
//如果当前结点 没有访问过则进行操作 即以nums[i]为当前结点 进行一次深度优先搜索
if(-1==hash[i]){
//计时器归零
Cnt=0;
//调用深度优先搜索
dfs(nums,i,++color);
//比较 条件数组长度
Max=max(Max,Cnt);
}
}
return Max;
}
};
/*
5 6 2 0即与数与 开始下标重复 结束
*/
三.知识点
(1)深度优先搜索递归