मान लीजिए कि हमारे पास शून्य-अनुक्रमित सरणी A लंबाई 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]]]… उस सादृश्य से, हम एस में एक डुप्लिकेट तत्व होने से ठीक पहले जोड़ना बंद कर देते हैं। इसलिए यदि सरणी ए =[5,4,0,3,1,6,2] की तरह है, तो आउटपुट 4 होगा, जैसा कि ए [ 0] =5, ए [1] =4, ए [2] =0, ए [3] =3, ए [4] =1, ए [5] =6, और अंत में ए [6] =2.पी>
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- इसलिए dfs नाम का एक फंक्शन बनाएं। यह नोड, एआर सरणी, वी सरणी, और एक सेट का दौरा करेगा। निम्नलिखित को dfs सरणी में करें -
- यदि नोड का दौरा किया जाता है, तो वापस आएं
- नोड को v में डालें, नोड को विज़िट किया गया के रूप में चिह्नित करें
- dfs(arr[node], arr, v, देखे गए)
- मुख्य विधि से, निम्न कार्य करें -
- ret:=0, n:=अंकों का आकार। विज़िट नामक एक सेट बनाएं
- मैं के लिए 0 से n - 1 की सीमा में
- एक सरणी v बनाएं
- यदि nums[i] का दौरा नहीं किया जाता है, तो dfs(nums[i], nums, v, विज़िट किया गया)
- 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