题目:
题解:
一个可行的思路是用 环形数组 + 滑动窗口 来实现这道题,环形数组实现环的逻辑,滑动窗口实现相互交替的逻辑。
滑动窗口:
右移动:1.当前加入元素与不同于已有元素最后一个元素则加入 2.当前元素与已有元素最后一个元素相同时窗口左右边界同时向后移动一位。
左移动:1.窗口大小大于要求向右移动一位, 2.当前元素与已有元素最后一个元素相同时窗口左右边界同时向后移动一位。
环形数组:
与普通数组的差别:
1.下标不能赋值为对数组长度取余
2.下标索引:每次通过索引取值时要对数组长度取余
相同:区间长度计算与普通数组相同。
int numberOfAlternatingGroups(vector<int>& colors, int k) {
int l=0,r=0,len=colors.size();
int ans=0;
while(r<len+k-2){
if(colors[(r+1)%len]==colors[r%len]){
r=r+1;
l=r;
}else {
r+=1;
if(r-l+1>=k)ans++;
if(r-l+1>k)l+=1;
}
}
return ans;
}