leetcode:457. 环形数组循环(中等,数组,快慢指针)

题目:

在这里插入图片描述

分析:

感觉还是一道比较简单的题目。
记忆化的暴力就可以啦,一个点可能被前后经过两个吗,显然不能够,因为要求整体的方向必须是一致的。
在过程中还需要了其他考虑欠佳的情况,比如说,有环不一定适合第一个元素相等,可能是走着走着才遇到的环。
结果还是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;
    }
};

在这里插入图片描述
惊了,快慢指针很快吗?

分析三:其他思路,和自己的差不多。

在这里插入图片描述


版权声明:本文为weixin_42721412原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。