LeetCode-in-Java

3208. Alternating Groups II

Medium

There is a circle of red and blue tiles. You are given an array of integers colors and an integer k. The color of tile i is represented by colors[i]:

An alternating group is every k contiguous tiles in the circle with alternating colors (each tile in the group except the first and last one has a different color from its left and right tiles).

Return the number of alternating groups.

Note that since colors represents a circle, the first and the last tiles are considered to be next to each other.

Example 1:

Input: colors = [0,1,0,1,0], k = 3

Output: 3

Explanation:

Alternating groups:

Example 2:

Input: colors = [0,1,0,0,1,0,1], k = 6

Output: 2

Explanation:

Alternating groups:

Example 3:

Input: colors = [1,1,0,1], k = 4

Output: 0

Explanation:

Constraints:

Solution

public class Solution {
    public int numberOfAlternatingGroups(int[] colors, int k) {
        int i = 0;
        int len = 0;
        int total = 0;
        while (i < colors.length - 1) {
            int j = i + 1;
            if (colors[j] != colors[i]) {
                len = 2;
                j++;
                while (j < colors.length && colors[j] != colors[j - 1]) {
                    j++;
                    len++;
                }
                if (j == colors.length) {
                    break;
                }
                total += Math.max(0, (len - k + 1));
            }
            i = j;
            len = 0;
        }
        if (colors[0] != colors[colors.length - 1]) {
            // if(len == colors.length) {
            //     return Math.max(0, colors.length);
            // }
            len = len == 0 ? 2 : len + 1;
            int j = 1;
            while (j < colors.length && colors[j] != colors[j - 1]) {
                j++;
                len++;
            }
            if (j >= k) {
                len -= (j - k + 1);
            }
        }
        total += Math.max(0, (len - k + 1));
        return total;
    }
}