mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-04 16:12:47 +08:00
38 lines
871 B
Go
38 lines
871 B
Go
package leetcode
|
|
|
|
func circularArrayLoop(nums []int) bool {
|
|
if len(nums) == 0 {
|
|
return false
|
|
}
|
|
for i := 0; i < len(nums); i++ {
|
|
if nums[i] == 0 {
|
|
continue
|
|
}
|
|
// slow/fast pointer
|
|
slow, fast, val := i, getNextIndex(nums, i), 0
|
|
for nums[fast]*nums[i] > 0 && nums[getNextIndex(nums, fast)]*nums[i] > 0 {
|
|
if slow == fast {
|
|
// check for loop with only one element
|
|
if slow == getNextIndex(nums, slow) {
|
|
break
|
|
}
|
|
return true
|
|
}
|
|
slow = getNextIndex(nums, slow)
|
|
fast = getNextIndex(nums, getNextIndex(nums, fast))
|
|
}
|
|
// loop not found, set all element along the way to 0
|
|
slow, val = i, nums[i]
|
|
for nums[slow]*val > 0 {
|
|
next := getNextIndex(nums, slow)
|
|
nums[slow] = 0
|
|
slow = next
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func getNextIndex(nums []int, index int) int {
|
|
return ((nums[index]+index)%len(nums) + len(nums)) % len(nums)
|
|
}
|