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