滑动窗口
解法:滑动窗口
枚举组的开头,那么组中间的 $(k - 2)$ 个元素都需要满足“与两边的颜色不同”的条件。预处理哪些元素和两边的颜色不同,再用滑动窗口统计中间的 $(k - 2)$ 个元素中,有几个满足该条件即可。复杂度 $\mathcal{O}(n)$。
参考代码(c++)
###cpp
class Solution {
public:
int numberOfAlternatingGroups(vector<int>& colors, int K) {
int n = colors.size();
// 预处理哪些元素与两边颜色不同
int f[n];
for (int i = 0; i < n; i++) {
int x = colors[(i - 1 + n) % n];
int y = colors[i];
int z = colors[(i + 1) % n];
if (x != y && y != z) f[i] = 1;
else f[i] = 0;
}
// 滑动窗口
int sm = 0;
for (int i = 1; i + 1 < K; i++) sm += f[i];
int ans = 0;
for (int i = 0; i < n; i++) {
if (sm == K - 2) ans++;
sm -= f[(i + 1) % n];
sm += f[(i + K - 1) % n];
}
return ans;
}
};