Every day a Leetcode
题目来源:3208. 交替组 II
解法1:环形数组
把数组复制一份拼接起来,和 3101 题一样,遍历数组的同时,维护以 i 为右端点的交替子数组的长度 cnt。
如果 i ≥ n 且 cnt ≥ k,那么 i 就是一个长为 k 的交替子数组的右端点,答案加一。注意这里要判断 i ≥ n,从而避免重复统计。
代码实现时,不需要复制数组,而是用 i mod n 的方式取到对应的值。
代码:
/*
* @lc app=leetcode.cn id=3208 lang=cpp
*
* [3208] 交替组 II
*/
// @lc code=start
class Solution
{
public:
int numberOfAlternatingGroups(vector<int> &colors, int k)
{
int n = colors.size();
int ans = 0, cnt = 0;
for (int i = 0; i < n * 2; i++)
{
if (i > 0 && colors[i % n] == colors[(i - 1) % n])
{
cnt = 0;
}
cnt++;
ans += i >= n && cnt >= k;
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 colors 的长度。
空间复杂度:O(1)。