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;
}
相关推荐
康谋自动驾驶2 分钟前
拆解3D Gaussian Splatting:原理框架、实战 demo 与自驾仿真落地探索!
算法·数学建模·3d·自动驾驶·汽车
AI科技星4 分钟前
垂直原理:宇宙的沉默法则与万物运动的终极源头
android·服务器·数据结构·数据库·人工智能
一念&41 分钟前
每日一个C语言知识:C 共用体
c语言
QuantumLeap丶1 小时前
《数据结构:从0到1》-05-数组
数据结构·数学
violet-lz1 小时前
数据结构八大排序:希尔排序-原理解析+C语言实现+优化+面试题
数据结构·算法·排序算法
ezl1fe1 小时前
第一篇:把任意 HTTP API 一键变成 Agent 工具
人工智能·后端·算法
冯诺依曼的锦鲤1 小时前
算法练习:双指针专题
c++·算法
吃着火锅x唱着歌1 小时前
LeetCode 668.乘法表中第k小的数
算法·leetcode·职场和发展
前端小刘哥1 小时前
互联网直播点播平台EasyDSS流媒体技术如何赋能多媒体展厅智能化升级?
算法
Python算法实战2 小时前
平安大模型面试题:Self-Attention 原理与多头注意力设计
人工智能·算法·自然语言处理·大模型·面试题