直觀的方法就是拿double loop來做:loop數(shù)組,然后針對每一個元素往深再loop找circle,同時用一個set來存deeper loop的元素,最后記錄最大的set size. 這樣做過不了大數(shù)據(jù)test
int arrayNesting(vector<int>& nums) {
if(nums.empty()) return 0;
int ret_size = 0;
for(int i=0; i<nums.size(); i++){
int cur = nums[i];
set<int> st;
while(!st.count(cur)){
st.insert(cur);
cur = nums[cur];
}
if(st.size() > ret_size) ret_size = st.size();
}
return ret_size;
}
參照網(wǎng)上思路后,優(yōu)化點在于有的元素會被loop好多次 (比如index 1, 3, 5, 7 組成一個circle,那么會重復(fù)loop到1,3,5,7; 3,5,7; 5,7; 7)。應(yīng)該把deeper loop完的數(shù)設(shè)為-1,這樣就不會重復(fù)了.
https://discuss.leetcode.com/topic/90538/c-java-clean-code-o-n
int arrayNesting(vector<int>& nums) {
if(nums.empty()) return 0;
int ret_size = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i] < 0) continue;
int cur = nums[i];
nums[i] = -nums[i];
set<int> st;
while(!st.count(cur) && cur >= 0){
st.insert(cur);
int temp = nums[cur];
nums[cur] = -nums[cur];
cur = temp;
}
if(st.size() > ret_size) ret_size = st.size();
}
return ret_size;
}