题目:
分析:
感觉还是一道比较简单的题目。
记忆化的暴力就可以啦,一个点可能被前后经过两个吗,显然不能够,因为要求整体的方向必须是一致的。
在过程中还需要了其他考虑欠佳的情况,比如说,有环不一定适合第一个元素相等,可能是走着走着才遇到的环。
结果还是T了:
代码:
class Solution {
public:
bool circularArrayLoop(vector<int>& nums) {
/*
nums.clear();
nums.push_back(-1);
nums.push_back(-1);
nums.push_back(-3);
*/
vector<int> v(nums.size(),0);
for(int i=0;i<nums.size();i++)
{
set<int> s;
s.insert(i);
int c=i;
int begin=nums[i];
while(1)
{
c=(c+nums[c]+nums.size())%nums.size();
if(c<i) break;
if(s.count(c)==1)
{
if(s.size()!=1&&nums[c]==begin) return 1;
break;
}
if(nums[c]*begin>0) s.insert(c);
else break;
}
}
return 0;
}
};
分析2:问题归类,有数组环问题的判断,应该是使用快慢指针。
class Solution {
public:
bool circularArrayLoop(vector<int>& nums) {
vector<int> v(nums.size(),0);
for(int i=0;i<nums.size();i++)
{
if(v[i]) continue;
v[i]=1;
int m=i;
int k=(i+nums[i]+nums.size())%nums.size();
if(nums[m]*nums[k]<=0) continue;
//'cout<<i<<endl;
while(1)
{
if(k==m)
{
//cout<<m<<' '<<k<<endl;
if((k+nums[k]+nums.size())%nums.size()==k) break;
return 1;
}
m=(m+nums[m]+nums.size())%nums.size();
int c=(k+nums[k]+nums.size())%nums.size();
v[c]=1;
if(nums[c]*nums[k]<=0) break;
k=(c+nums[c]+nums.size())%nums.size();
if(nums[c]*nums[k]<=0) break;
v[k]=1;
//cout<<m<<' '<<k<<endl;
}
}
return 0;
}
};
惊了,快慢指针很快吗?