Skip to content

https://leetcode.cn/problems/count-alternating-subarrays/description/

输入: nums = [0,1,1,1]

输出: 5

5=1+2+1+1

输入: nums = [1,0,1,0]

输出: 10

10=1+2+3+4

可以发现规律,如果不重复,就是每次累加,否则个数就只是+1。

本质是个dp。

python
var countAlternatingSubarrays = function(nums) {
    if(!nums || nums.length==0){
        return 0
    }
    //p[i] denote the number of alternating subarrays that ends with nums[i]
    let p=new Array(nums.length).fill(1)
    for(let i=1;i<nums.length;i++){
        if(nums[i]!==nums[i-1]){
            p[i]=p[i-1]+1
        }
    }
    return p.reduce((acc,curr)=>acc+curr)
};

但这里可以进行空间优化:

js
/**
 * @param {number[]} nums
 * @return {number}
 */
var countAlternatingSubarrays = function(nums) {
    if(!nums || nums.length==0){
        return 0
    }
    let i=1 // pointer
    let k=1 // counter
    let R=1
    for(i=1;i<nums.length;i++){
        if(nums[i]!==nums[i-1]){
            k+=1
            R+=k
        }else{
            k=1
            R+=1
        }
    }
    return R
};