0%

3101. 交替子数组计数

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。

1
2
3
4
5
6
7
8
9
10
11
12
13
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)
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @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
};