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
};