直观的方法就是拿double loop来做:loop数组,然后针对每一个元素往深再loop找circle,同时用一个set来存deeper loop的元素,最后记录最大的set size. 这样做过不了大数据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;
}
参照网上思路后,优化点在于有的元素会被loop好多次 (比如index 1, 3, 5, 7 组成一个circle,那么会重复loop到1,3,5,7; 3,5,7; 5,7; 7)。应该把deeper loop完的数设为-1,这样就不会重复了.
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;
}