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;
}
相关推荐
练习时长一年15 分钟前
LeetCode热题100(二叉树的最大路径和)
算法·leetcode·职场和发展
2401_872418786 小时前
算法入门:数据结构-堆
数据结构·算法
xwz小王子8 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
黎阳之光9 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新9 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手9 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈10 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet10 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农10 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
snow@li10 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法