题目描述:
给你一个整数数组 colors
和一个整数 k
,colors
表示一个由红色和蓝色瓷砖组成的环,第 i
块瓷砖的颜色为 colors[i]
:
colors[i] == 0
表示第i
块瓷砖的颜色是 红色 。colors[i] == 1
表示第i
块瓷砖的颜色是 蓝色 。
环中连续 k
块瓷砖的颜色如果是 交替 颜色(也就是说除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它左边 和 右边 的颜色都不同),那么它被称为一个 交替 组。
请你返回 交替 组的数目。
注意 ,由于 colors
表示一个 环 ,第一块 瓷砖和 最后一块 瓷砖是相邻的。
代码思路:
这个代码的目的是计算在一个环形数组中,有多少长度为 k
的交替颜色组。环形数组意味着数组末尾和开头是相连的。函数的参数包括一个整数数组 colors
,数组的大小 colorsSize
,以及目标长度 k
。下面是这个代码的思路分析:
- 初始化变量 :
l
和r
分别表示当前考虑的交替颜色组的左边界和右边界的索引。开始时,l
指向第一个元素(索引0),r
指向第二个元素(索引1)。cnt
表示当前考虑的交替颜色组的长度,起始为1(因为从第一个元素开始)。ret
用于记录满足条件的交替颜色组的总数,初始化为0。
- 循环遍历 :
- 循环条件是
r < colorsSize + k - 1
。由于数组是环形的,所以通过取模运算来确保索引在有效范围内。这里加k - 1
是因为我们可能需要检查到数组的末尾之后的一些元素(由于是环形数组,这些元素实际上在数组的开始部分)。
- 循环条件是
- 检查颜色交替 :
- 使用
colors[(r % colorsSize)] ^ colors[(r - 1) % colorsSize]
来检查当前元素和前一个元素的颜色是否交替(这里使用异或运算^
,如果颜色相同,结果为0,颜色不同,结果非0)。 - 如果颜色交替,
cnt
自增,表示当前交替颜色组的长度增加。 - 如果
cnt
达到k
,说明找到了一个长度为k
的交替颜色组,此时:ret
自增,记录找到一个符合条件的组。- 更新左边界
l
到当前组的下一个位置(即l = l + 1
或l = r
,因为r
此时指向组的最后一个元素的下一个位置)。 - 重置
cnt
为1,开始寻找下一个交替颜色组。
- 如果颜色不交替,说明当前交替颜色组被打破,需要重新开始计数:
- 更新左边界
l
到当前位置r
。 - 重置
cnt
为1。
- 更新左边界
- 使用
- 返回结果 :
- 循环结束后,返回
ret
,即满足条件的交替颜色组的总数。
- 循环结束后,返回
代码实现:
cs
int numberOfAlternatingGroups(int* colors, int colorsSize, int k) {
//可以将前k-1个加在最后,以第i块开头为标记
int l = 0;
int r = 1;
int cnt = 1; //交替颜色的长度,起始为1
int ret = 0;
while (r < colorsSize + k - 1) {
if (colors[(r % colorsSize)] ^ colors[(r - 1) % colorsSize]) {
cnt++;
if (cnt == k) {
ret++;
l++;
cnt--;
}
} else {
l = r;
cnt = 1;
}
r++;
}
return ret;
}