ধরুন আমাদের দৈর্ঘ্যের N এর একটি শূন্য-সূচীযুক্ত অ্যারে রয়েছে যাতে 0 থেকে N-1 পর্যন্ত সমস্ত পূর্ণসংখ্যা রয়েছে। আমাদের সেট S এর দীর্ঘতম দৈর্ঘ্য খুঁজে বের করতে হবে এবং ফেরত দিতে হবে, যেখানে S[i] ={A[i], A[A[i]], A[A[A[i]]], ... } এর অধীন নিচের নিয়ম। এখন বিবেচনা করুন S-তে প্রথম উপাদানটি সূচী =i-এর A[i] উপাদান নির্বাচন দিয়ে শুরু হয়, S-এর পরবর্তী উপাদানটি A[A[i]] এবং তারপর A[A[A[i]]]... সেই সাদৃশ্য অনুসারে, S-তে একটি ডুপ্লিকেট এলিমেন্ট আসার আগেই আমরা যোগ করা বন্ধ করে দিই। সুতরাং অ্যারেটি যদি A =[5,4,0,3,1,6,2] এর মত হয়, তাহলে আউটপুট হবে 4, A[ 0] =5, A[1] =4, A[2] =0, A[3] =3, A[4] =1, A[5] =6, এবং অবশেষে A[6] =2.
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- তাই dfs নামে একটি ফাংশন তৈরি করুন। এটি নোড, অ্যারের অ্যারে, ভি অ্যারে এবং একটি সেট পরিদর্শন করবে। dfs অ্যারে - -এ নিম্নলিখিতগুলি করুন৷
- যদি নোড পরিদর্শন করা হয়, তাহলে ফিরে আসুন
- v-এ নোড ঢোকান, নোডকে ভিজিট করা হিসেবে চিহ্নিত করুন
- dfs(arr[node], arr, v, visited)
- প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
- ret :=0, n :=সংখ্যার আকার। ভিজিটড নামে একটি সেট তৈরি করুন
- আমি 0 থেকে n – 1
- পরিসরে
- একটি অ্যারে তৈরি করুন v
- যদি nums[i] পরিদর্শন না করা হয়, তাহলে dfs(nums[i], nums, v, visited)
- ret :=ret এর সর্বোচ্চ এবং v এর আকার
- রিটার্ন রিটার্ন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: void dfs(int node, vector <int>& arr, vector <int>& v, set <int>& visited){ if(visited.count(node)) return; v.push_back(node); visited.insert(node); dfs(arr[node], arr, v, visited); } int arrayNesting(vector<int>& nums) { int ret = 0; int n = nums.size(); set <int> visited; for(int i = 0; i < n; i++){ vector <int> v; if(!visited.count(nums[i]))dfs(nums[i], nums, v, visited); ret = max(ret, (int)v.size()); } return ret; } }; main(){ vector<int> v = {5,4,0,3,1,6,2}; Solution ob; cout << (ob.arrayNesting(v)); }
ইনপুট
[5,4,0,3,1,6,2]
আউটপুট
4