Giả sử chúng ta có một mảng A không được lập chỉ mục có độ dài N chứa tất cả các số nguyên từ 0 đến N-1. Chúng ta phải tìm và trả về độ dài dài nhất của tập S, trong đó S [i] ={A [i], A [A [i]], A [A [A [i]]], ...} phải chịu quy tắc dưới đây. Bây giờ hãy xem xét phần tử đầu tiên trong S bắt đầu với việc lựa chọn phần tử A [i] của index =i, phần tử tiếp theo trong S phải là A [A [i]], và sau đó là A [A [A [i]]]… Bằng cách tương tự đó, chúng ta ngừng thêm ngay trước khi một phần tử trùng lặp xuất hiện trong S. Vì vậy, nếu mảng giống như A =[5,4,0,3,1,6,2], thì đầu ra sẽ là 4, là A [ 0] =5, A [1] =4, A [2] =0, A [3] =3, A [4] =1, A [5] =6 và cuối cùng là A [6] =2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Vì vậy, hãy tạo một hàm có tên là dfs. Điều này sẽ đưa nút, mảng arr, mảng v và một tập hợp được truy cập. Làm như sau trong mảng dfs -
- nếu nút được truy cập, sau đó quay lại
- chèn nút vào v, đánh dấu nút là đã truy cập
- dfs (arr [node], arr, v, đã truy cập)
- Từ phương pháp chính, hãy thực hiện như sau -
- ret:=0, n:=kích thước của nums. tạo một tập hợp được gọi là đã thăm
- cho tôi trong phạm vi từ 0 đến n - 1
- tạo một mảng v
- nếu nums [i] không được truy cập, thì dfs (nums [i], nums, v, đã truy cập)
- ret:=tối đa của ret và kích thước là v
- trả lời lại
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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)); }
Đầu vào
[5,4,0,3,1,6,2]
Đầu ra
4