457.環形陣列迴圈
給定一組含有正整數和負整數的陣列。如果某個索引中的 n 是正數的,則向前移動 n 個索引。相反,如果是負數(-n),則向後移動 n 個索引。
假設陣列首尾相接。判斷陣列中是否有環。環中至少包含 2 個元素。環中的元素一律“向前”或者一律“向後”。
示例 1:給定陣列 [2, -1, 1, 2, 2], 有一個迴圈,從索引 0 -> 2 -> 3 -> 0。
示例 2:給定陣列[-1, 2], 沒有迴圈。
注意:給定陣列保證不包含元素"0"。
你能寫出時間複雜度為 O(n) 且空間複雜度為 O(1) 的演算法嗎?
class Solution {
public:
bool circularArrayLoop(vector<int>& nums) {
unordered_map<int, int> m;
int n = nums.size();
vector<bool> visited(n, false);
for (int i = 0; i < n; ++i) {
if (visited[i]) continue;
int cur = i;
while (true) {
visited[cur] = true;
int next = (cur + nums[cur]) % n;
if (next < 0) next += n;
if (next == cur || nums[next] * nums[cur] < 0) break;
if (m.count(next)) return true;
m[cur] = next;
cur = next;
}
}
return false;
}
};