description

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
    // but we wont use the formula here, because it just easier
    // to sum it up ourself
    pub fn count_alternating_subarrays(nums: Vec<i32>) -> i64 {
        nums.iter()
            .enumerate()
            // the initial state, sum, prev_index, prev_value
            .fold((0, 0, -1), |(sum, mut prev_i, prev_v), (idx, &val)| {
                // encouter same value, split partition here
                if val == prev_v {
                    prev_i = idx;
                }
                // keep folding
                (sum + (idx - prev_i + 1) as i64, prev_i, val)
            })
            .0
    }
}