执行结果:通过

题目:3208 交替组II
给你一个整数数组 colors 和一个整数 k ,colors表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] :
colors[i] == 0表示第i块瓷砖的颜色是 红色 。colors[i] == 1表示第i块瓷砖的颜色是 蓝色 。
环中连续 k 块瓷砖的颜色如果是 交替 颜色(也就是说除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它 左边 和 右边 的颜色都不同),那么它被称为一个 交替 组。
请你返回 交替 组的数目。
注意 ,由于 colors 表示一个 环 ,第一块 瓷砖和 最后一块 瓷砖是相邻的。
示例 1:
输入:colors = [0,1,0,1,0], k = 3
输出:3
解释:

交替组包括:



示例 2:
输入:colors = [0,1,0,0,1,0,1], k = 6
输出:2
解释:

交替组包括:


示例 3:
输入:colors = [1,1,0,1], k = 4
输出:0
解释:

提示:
3 <= colors.length <= 1050 <= colors[i] <= 13 <= k <= colors.length
代码以及解题思路
代码:
class Solution:
def numberOfAlternatingGroups(self, colors: List[int], k: int) -> int:
ans = 0
start, n = 0, len(colors)
From_head = True # 从头开始检查是否交替
while start < n:
if From_head:
for i in range(start, start + k - 1):
if colors[i%n] == colors[(i+1)%n]:
start = i + 1 # 直接跳到i+1,start~i+1的都不合法
break
else: # 当前窗口全交替,下一个只需检查最后两位是否交替
ans += 1
start += 1
From_head = False
else:
if colors[(start+k-1)%n] == colors[(start+k-2)%n]:
From_head = True
start += k - 1
else:
ans += 1
start += 1
return ans
解题思路:
- 初始化变量:
ans:记录满足条件的交替子数组的数量。start:当前滑动窗口的起始位置。n:颜色数组colors的长度。From_head:布尔值,表示当前是否从头开始检查整个窗口的交替性。
- 滑动窗口遍历:
- 使用一个
while循环遍历数组,条件是start < n,确保不会越界。 - 从头开始检查(
From_head = True):- 使用一个
for循环检查从start到start + k - 1的窗口内的元素是否交替。 - 如果在这个窗口内发现相邻元素颜色相同,则更新
start为i + 1,并跳出循环,因为当前窗口不满足交替条件,需要从下一个位置重新开始检查。 - 如果整个窗口检查完毕且满足交替条件,则增加
ans的值,表示找到了一个满足条件的子数组。 - 更新
start为start + 1,准备检查下一个窗口,并设置From_head = False,表示下一个窗口只需检查最后两个元素是否交替。
- 使用一个
- 不从头开始检查(
From_head = False):- 直接检查当前窗口的最后一个元素和倒数第二个元素是否交替。
- 如果它们颜色相同,说明当前窗口不满足交替条件,需要将
From_head设置为True并更新start为start + k - 1,准备从头开始检查下一个窗口。 - 如果它们颜色不同,则增加
ans的值,并更新start为start + 1,准备检查下一个窗口。
- 使用一个
- 处理周期性边界条件:
- 在数组遍历中,使用
% n来处理数组首尾相连的情况,确保索引不会越界。
- 在数组遍历中,使用
- 返回结果:
- 当
while循环结束后,返回ans,即满足条件的交替子数组的数量。
- 当


![[C++ 核心编程]笔记 4.1 封装](https://i-blog.csdnimg.cn/direct/6b627bfd3bb642438eade5852eadc648.png#pic_center)
















