import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return bool布尔型
     */
    public boolean checkCircularArray (int[] nums) {
        // write code here
        int n = nums.length;
        //存储走过的下标
        boolean[] vis = new boolean[n];
        for(int i = 0; i < n; i++){
            if(vis[i]) continue;
            Set<Integer> set = new HashSet<>();
            int x = nums[i] > 0 ? 1 : -1;
            int r = i;
            //从当前下标路径遍历,判断是否有循环
            while(!vis[r]){
                vis[r] = true;
                set.add(r);
                //判断是否同号
                if(x * nums[r] > 0){
                    r = (r + nums[i] + n) % n;
                    //如果找到相同下标,则存在环
                    if(set.contains(r) && set.size() >= 2) return true;
                }else{
                    //异号,退出当前循环
                    vis[r] = false;
                    break;
                }
            }
        }
        return false;
    }
}
#include <set>
#include <unordered_set>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool checkCircularArray(vector<int>& nums) {
        // write code here
        int n = nums.size();
        //判断是否走过当前下标
        vector<bool> vis(n, false);
        for(int i = 0; i < n; i++){
            if(vis[i]) continue;
            //存储走过的下标
            unordered_set<int> set;
            //记录初始下标正负
            int x = nums[i] > 0 ? 1 : -1;
            int r = i;
            //从当前下标路径遍历,判断是否有循环
            while(!vis[r]){
                vis[r] = true;
                set.insert(r);
                //判断是否同号
                if(x * nums[r] > 0){
                    r = (r + nums[r] + n) % n;
                    //如果找到相同下标,则存在环
                    if(set.count(r) && set.size() >= 2) return true;
                }else{
                    //异号,退出当前循环
                    vis[r] = false;
                    break;
                }
            }
        }
        return false;
    }
};