problem

You are given a binary array nums.

We call a subarray alternating if no two adjacent elements in the subarray have the same value.

Return the number of alternating subarrays in nums.

 

Example 1:

Input: nums = [0,1,1,1]

Output: 5

Explanation:

The following subarrays are alternating: [0], [1], [1], [1], and [0,1].

Example 2:

Input: nums = [1,0,1,0]

Output: 10

Explanation:

Every subarray of the array is alternating. There are 10 possible subarrays that we can choose.

 

Constraints:

  • 1 <= nums.length <= 105
  • nums[i] is either 0 or 1.

submission

impl Solution {
    // we split the whole array into N alternating subarray
    // partitions, assume the length of a partition is len,
    // it contribute 1+2+3+...+len = (len + 1) * len / 2
    // to the final answer
    pub fn count_alternating_subarrays(nums: Vec<i32>) -> i64 {
        nums.chunk_by(|a, b| a != b)
            .map(|chunk| (chunk.len() * (chunk.len() + 1) / 2) as i64)
            .sum()
    }
}