3374 - Count Alternating Subarrays
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 either0
or1
.
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
}
}