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;
}
相关推荐
Ttang231 小时前
数据结构——用链表实现栈和队列
数据结构·链表
糕冷小美n1 小时前
jeecgbootvue2重新整理数组数据或者添加合并数组并遍历背景图片或者背景颜色
数据结构·算法
CV万花筒1 小时前
点云欧式聚类,条件欧式聚类算法原理及推导
算法·数据挖掘·聚类
ZZZ_O^O2 小时前
【贪心算法-第三弹——Leetcode-179.最大数】
c++·学习·算法·leetcode·贪心算法
Matlab程序猿小助手2 小时前
【MATLAB源码-第228期】基于matlab的鼠群优化算法(RSO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab·机器人·无人机
z千鑫3 小时前
【C/C++】深入解析 Stack 与 Queue 数据结构(详解):实现原理、应用场景与性能优化
c语言·开发语言·数据结构·c++·深度学习·算法·排序算法
Y编程小白3 小时前
Leecode经典题2--移除元素
数据结构·算法·leetcode
Wils0nEdwards3 小时前
Leetcode 颠倒二进制位
算法·leetcode·职场和发展
醇醛酸醚酮酯3 小时前
两数之和--leetcode100题
数据结构·算法·leetcode
xiaoshiguang33 小时前
LeetCode:19.删除链表倒数第N个节点
算法·leetcode·链表