问题背景
给你一个 二进制数组 n u m s nums nums。
如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。
返回数组 n u m s nums nums 中交替子数组的数量。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1≤nums.length≤105
- n u m s [ i ] nums[i] nums[i] 不是 0 0 0 就是 1 1 1
解题过程
由于数组是二进制的,在循环变量 i > 0 i > 0 i>0 的前提下,任何 n u m s [ i ] nums[i] nums[i] 与 n u m [ i − 1 ] num[i - 1] num[i−1] 的关系只可能是相等或者不等。针对这两种情况:
- 二者相等时,当前数字能和所有以前一位为结尾的交替子数组构成新的交替子数组,再加上这个数字单独构成一个新的交替子数组,此时的总数为上一位的数量 c o u n t count count 自增的结果。
- 二者不等时,当前数字不能能和任何以前一位为结尾的交替子数组构成新的交替子数组,因此只有这个数字单独构成的新的交替子数组,此时的总数就是 1 1 1。
循环的过程中把各个位置上的总数累计起来,就得到最终结果。
具体实现
class Solution {public long countAlternatingSubarrays(int[] nums) {long res = 0;int count = 1;for(int i = 0; i < nums.length; i++) {if(i > 0 && nums[i] != nums[i - 1]) {count++;} else {count = 1;}res += count;}return res;}
}