Leetcode3208:交替组 II

题目描述:

给你一个整数数组 colors 和一个整数 kcolors表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i]

  • colors[i] == 0 表示第 i 块瓷砖的颜色是 红色
  • colors[i] == 1 表示第 i 块瓷砖的颜色是 蓝色

环中连续 k 块瓷砖的颜色如果是 交替 颜色(也就是说除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它左边右边 的颜色都不同),那么它被称为一个 交替 组。

请你返回 交替 组的数目。

注意 ,由于 colors 表示一个 第一块 瓷砖和 最后一块 瓷砖是相邻的。

代码思路:

这个代码的目的是计算在一个环形数组中,有多少长度为 k 的交替颜色组。环形数组意味着数组末尾和开头是相连的。函数的参数包括一个整数数组 colors,数组的大小 colorsSize,以及目标长度 k。下面是这个代码的思路分析:

  1. 初始化变量
    • lr 分别表示当前考虑的交替颜色组的左边界和右边界的索引。开始时,l 指向第一个元素(索引0),r 指向第二个元素(索引1)。
    • cnt 表示当前考虑的交替颜色组的长度,起始为1(因为从第一个元素开始)。
    • ret 用于记录满足条件的交替颜色组的总数,初始化为0。
  2. 循环遍历
    • 循环条件是 r < colorsSize + k - 1。由于数组是环形的,所以通过取模运算来确保索引在有效范围内。这里加 k - 1 是因为我们可能需要检查到数组的末尾之后的一些元素(由于是环形数组,这些元素实际上在数组的开始部分)。
  3. 检查颜色交替
    • 使用 colors[(r % colorsSize)] ^ colors[(r - 1) % colorsSize] 来检查当前元素和前一个元素的颜色是否交替(这里使用异或运算 ^,如果颜色相同,结果为0,颜色不同,结果非0)。
    • 如果颜色交替,cnt 自增,表示当前交替颜色组的长度增加。
    • 如果 cnt 达到 k,说明找到了一个长度为 k 的交替颜色组,此时:
      • ret 自增,记录找到一个符合条件的组。
      • 更新左边界 l 到当前组的下一个位置(即 l = l + 1l = r,因为 r 此时指向组的最后一个元素的下一个位置)。
      • 重置 cnt 为1,开始寻找下一个交替颜色组。
    • 如果颜色不交替,说明当前交替颜色组被打破,需要重新开始计数:
      • 更新左边界 l 到当前位置 r
      • 重置 cnt 为1。
  4. 返回结果
    • 循环结束后,返回 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;
}
相关推荐
chao1898444 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙4 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
難釋懷4 小时前
Redis数据结构-Set结构
数据结构·redis·bootstrap
little~钰5 小时前
倍增算法和ST表
算法
知识领航员6 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪6 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
如何原谅奋力过但无声7 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠7 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
ECT-OS-JiuHuaShan7 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算