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;
}
相关推荐
和裕42 分钟前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技1 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
Msshu1232 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
shirsl2 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
老王爱玩车3 小时前
深入理解指针2
c语言·开发语言·学习
土司大王3 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_962218613 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.4 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
wzdark5 小时前
基于启发式搜索的最优路径规划算法研究4
算法
动词ing5 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习