Circular Array Loop LeetCode solution in JavaScript

1
var circularArrayLoop = function (nums) {
2
// cannot be a cycle if there are less than 2 elements
3
const numsLen = nums.length;
4
if (numsLen < 2) return false;
5

6
// init visited array
7
const visited = Array(numsLen).fill(false);
8

9
// check each index to see if a cycle can be produced
10
for (let i = 0; i < numsLen; i++) {
11
if (visited[i]) continue;
12
visited[i] = true;
13
// determine initial direction
14
const isPositive = nums[i] > 0;
15

16
// reset which indices were visited after each iteration
17
const visitedPerIdx = Array(numsLen).fill(false);
18

19
// reset cycle length and current index after each iteration
20
let cycleLen = 0,
21
currIdx = i;
22

23
// loop while cycle is valid
24
while (true) {
25
// break if current index moves cycle in opposite direction
26
if (isPositive !== nums[currIdx] > 0) break;
27

28
// calc next valid index
29
let nextIdx = (currIdx + nums[currIdx]) % numsLen;
30
// map negative index to a positive index
31
if (nextIdx < 0) nextIdx += numsLen;
32

33
// break if cycle points to same index
34
if (currIdx === nextIdx) break;
35

36
cycleLen++;
37
// a cycle is found when the index has already been visited in the current outer iteration, and
38
// the cycle length is greater than 1.
39
if (visitedPerIdx[nextIdx] && cycleLen > 1) return true;
40

41
visitedPerIdx[nextIdx] = true;
42
visited[nextIdx] = true;
43
// set curr index to new index
44
currIdx = nextIdx;
45
}
46
}
47

48
return false;
49
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0