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;
}
};