3208 交替组 I & II

·   ·   ·   ·

  ·   ·


题目链接

3206. 交替组 I

3208. 交替组 II

分析

由于题目是中的数组表达的是一个环,所以我们将数组复制一份首尾链接(实际操作中取余即可)

考虑计算交替组,我们可以动态维护一个 $cnt$ 记录到当前位置的交替组的长度

对于每个位置,如果 $cnt >= k$ 则 $ans + 1$

要注意,由于我们将两个数组首尾相连拼在了一起,所以只有当 $i >= n$ ,即走到复制的数组时才开始记录答案

对于第一个数组,由于我们计算答案只从复制的数组第一个数 $n$ 开始,所以循环从 $n - k - 1$ 处开始即可

交替组 I 为 $k = 3$ 的特殊情况

代码实现

class Solution {
public:
    int numberOfAlternatingGroups(vector<int>& colors) {
        int ans = 0, cnt = 0, n = colors.size();
        for(int i = max(0, n - 4); i < (n << 1); ++i)
        {
            if(i > 0 && colors[i % n] == colors[(i - 1) % n])
                cnt = 0;
            cnt++;
            ans += i >= n && cnt >= 3;
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:$O(n)$,$n$ 为 $colors$ 的长度
  • 空间复杂度:$O(1)$,实际中并没有真正复制数组