1. 程式人生 > >457.環形陣列迴圈

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