首页 > 其他分享 >Leecode交替组

Leecode交替组

时间:2024-11-28 11:59:50浏览次数:9  
标签:颜色 瓷砖 int colors 交替 Leecode ans

交替组

[3206]交替组I

题目描述

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

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

环中连续 3 块瓷砖的颜色如果是 交替 颜色(也就是说中间瓷砖的颜色与它 左边右边 的颜色都不同),那么它被称为一个 交替 组。

请你返回 交替 组的数目。

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

示例输入

示例 1:

输入:colors = [1, 1, 1]

输出:0

image-20241126162823349

示例 2:

输入:colors = [0, 1, 0, 0, 1]

输出:3

image-20241126162953382

交替组如下:

image-20241126163736915

题解

我们可以通过以下的步骤来实现:

  1. 遍历数组,考虑当前位置及其前后两块瓷砖。
  2. 对于位置 i,检查三个位置 i-1, i, i+1 的颜色是否满足交替组的条件。
  3. 由于是环形结构,需要特别处理数组的头尾部分。
public int numberOfAlternatingGroups(int[] colors) {
    int ans = 0;
    int n = colors.length;
    for (int i = 0; i < n; i++) {
        if (colors[i] != colors[(i + 1) % n] && 
            colors[(i + 1) % n] != colors[(i + 2) % n]) {
            ans++;
        }
    }
    return ans;
}

[3207]交替组II

题目描述

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

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

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

请你返回 交替 组的数目。

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

示例输入

示例 1:

输入:colors = [0, 1, 0, 1, 0], k = 3

输出:3

image-20241126162953382

交替组如下:

image-20241126163736915

示例 2:

输入:colors = [0, 1, 0, 0, 1, 0, 1], k = 6

输出:2

image-20241127122434012

交替组如下:

image-20241127122512167

示例 3:

输入:colors = [1, 1, 0, 1], k = 4

输出:0

image-20241127122806494

题解

思路和上面的基本一样:

  • 外层循环:遍历数组中的每个起始位置 i
  • 内层循环:检查从当前位置 i 开始的 k 个瓷砖是否满足交替条件。对于每个瓷砖,检查它与左右瓷砖的颜色是否不同(除了第一块和最后一块瓷砖)。
  • 模运算:使用 colors[(i + j) % n] 来确保数组的环形结构。
public int numberOfAlternatingGroups(int[] colors, int k) {
    int ans = 0;
    int n = colors.length;
    for (int i = 0; i < n; i++) {
        // 检查从位置 i 开始的 k 个瓷砖是否满足交替条件
        boolean flag = true;
        for (int j = 0; j < k; j++) {
            // 检查第 j 块瓷砖与它的前后瓷砖颜色是否不同
            int prev = Math.floorMod(i + j - 1, n);
           	int current = Math.floorMod(i + j, n);
            int next = Math.floorMod(i + j + 1, n);
            // 如果不是第一块瓷砖或者最后一块瓷砖,则需要检查前后瓷砖的颜色
            if (j != 0 && j != k - 1) {
                if (colors[current] == colors[prev] || colors[current] == colors[next]) {
                    flag = false;
                    break;
                }
            }
        }
        if (flag) ans++;
    }
    return ans;
}

但这样需要双重循环,时间复杂度过高。

我们可以将环展开成一个长度为2n的数组,然后从左到右遍历这个数组,用一个变量记录当前交替组的长度,如果遇到了相同的颜色,就将当前交替组的长度重置为 1,否则加一。

如果交替组的长度大于k,并且当前位置i大于等于n,那么就找到了一个交替组,答案加一。

public int numberOfAlternatingGroups(int[] colors, int k) {
    int ans = 0;
    int n = colors.length;
    // 记录交替组的长度
    int currentLength = 0;

    for (int i = 0; i < 2 * n; ++i) {
        if (i > 0 && colors[i % n] == colors[(i - 1) % n]) {
            currentLength = 1;
        } else {
            currentLength++;
        }

        if (i >= n && currentLength >= k) ans++;
    }
    return ans;
}

标签:颜色,瓷砖,int,colors,交替,Leecode,ans
From: https://blog.csdn.net/ziyuexuan2020/article/details/144107610

相关文章

  • 【每日一题】 3208. 交替组 II
    给你一个整数数组 colors 和一个整数 k ,colors表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] :colors[i]==0 表示第 i 块瓷砖的颜色是 红色 。colors[i]==1 表示第 i 块瓷砖的颜色是 蓝色 。环中连续 k 块瓷砖的颜色如果是 交替 ......
  • leetcode3208. 交替组 II
    循环数组问题,指针问题代码比较好实现的,只需要对右端点维护,如果达到了>=k便可以被计数,循环数组可以两边循环做到点击查看代码classSolution{publicintnumberOfAlternatingGroups(int[]colors,intk){intn=colors.length;intans=0;......
  • 【每日一题】3206. 交替组
    给你一个整数数组 colors ,它表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] :colors[i]==0 表示第 i 块瓷砖的颜色是 红色 。colors[i]==1 表示第 i 块瓷砖的颜色是 蓝色 。环中连续3块瓷砖的颜色如果是 交替 颜色(也就是说中间瓷砖......
  • 基于交替方向乘法(ADMM)的PAPR约束下传输波束成形器设计的方法研究(Matlab代码实现)
     ......
  • leecode 数据库: 579. 查询员工的累计薪水
    表:Employee+-------------+------+|ColumnName|Type|+-------------+------+|id|int||month|int||salary|int|+-------------+------+(id,month)是该表的主键(具有唯一值的列的组合)。表中的每一行表示2020年期间员工......
  • leecode 数据库: 1164. 指定日期的产品价格
    表:Products+---------------+---------+|ColumnName|Type|+---------------+---------+|product_id|int||new_price|int||change_date|date|+---------------+---------+(product_id,change_date)是此表的主键(具有唯一......
  • leecode 数据库: 534. 游戏玩法分析 III
    表:Activity+--------------+---------+|ColumnName|Type|+--------------+---------+|player_id|int||device_id|int||event_date|date||games_played|int|+--------------+---------+(player_id,event_date)是此表的......
  • Leecode27移除元素
    题目Leecode27.移除元素给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:更改nums数组,使nums......
  • Leecode热题100-3.无重复字符最长子串
    给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度为1。......
  • Leecode热题100-75.颜色分类
    给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。示例1:输入:num......