LeetCode 题解工作台

交替组 II

给你一个整数数组 colors 和一个整数 k , colors 表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] == 0 表示第 i 块瓷砖的颜色是 红色 。 colors[i] == 1 表示第 i 块瓷砖的颜色是 蓝色 。 环中连续 k 块…

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 滑动窗口(状态滚动更新)

bolt

答案摘要

我们可以将环展开成一个长度为 的数组,然后从左到右遍历这个数组,用一个变量 记录当前交替组的长度,如果遇到了相同的颜色,就将 重置为 ,否则将 加一。如果 $\textit{cnt} \ge k$,并且当前位置 大于等于 ,那么就找到了一个交替组,答案加一。 遍历结束后,返回答案即可。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 滑动窗口(状态滚动更新) 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个整数数组 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 <= 105
  • 0 <= colors[i] <= 1
  • 3 <= k <= colors.length
lightbulb

解题思路

方法一:一次遍历

我们可以将环展开成一个长度为 2n2n 的数组,然后从左到右遍历这个数组,用一个变量 cnt\textit{cnt} 记录当前交替组的长度,如果遇到了相同的颜色,就将 cnt\textit{cnt} 重置为 11,否则将 cnt\textit{cnt} 加一。如果 cntk\textit{cnt} \ge k,并且当前位置 ii 大于等于 nn,那么就找到了一个交替组,答案加一。

遍历结束后,返回答案即可。

时间复杂度 O(n)O(n),其中 nn 为数组 colors\textit{colors} 的长度。空间复杂度 O(1)O(1)

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def numberOfAlternatingGroups(self, colors: List[int], k: int) -> int:
        n = len(colors)
        ans = cnt = 0
        for i in range(n << 1):
            if i and colors[i % n] == colors[(i - 1) % n]:
                cnt = 1
            else:
                cnt += 1
            ans += i >= n and cnt >= k
        return ans
speed

复杂度分析

指标
时间O(n + k)
空间O(1)
psychology

面试官常问的追问

外企场景
  • question_mark

    The candidate should focus on a sliding window approach rather than brute-force checking of all possible groups.

  • question_mark

    They should demonstrate an understanding of the circular nature of the problem and how to handle the edge cases effectively.

  • question_mark

    Look for clear, incremental updates to the window state and a focus on efficiency rather than recalculating the entire window on each iteration.

warning

常见陷阱

外企场景
  • error

    Failing to handle the circular nature of the problem, resulting in incorrect group counting when crossing the array's boundary.

  • error

    Not updating the window state efficiently, leading to unnecessary recomputations.

  • error

    Incorrectly assuming that the first and last tiles in the group do not need to alternate in color when checking for groups.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Adjusting the group size k dynamically based on input constraints.

  • arrow_right_alt

    Expanding the problem to handle groups with more than two colors.

  • arrow_right_alt

    Optimizing the approach further for arrays with larger sizes, using parallel processing techniques.

help

常见问题

外企场景

交替组 II题解:滑动窗口(状态滚动更新) | LeetCode #3208 中等