3101. 交替子数组计数
思路:方法一:观察第二个样例,会发现如果一段区间是01交替出现,那么这段区间的每个子数组都是交替子数组。区间长度为ct,那么交替子数组的数量为(ct+1) * ct/2。
利用这个规律,我们来找到所有01交替的子区间。区间长度可以为1。
class Solution {
public:
long long countAlternatingSubarrays(vector<int>& nums) {
long long ans=0;
int ct=1;
for(int i=1;i<nums.size();i++){
if(nums[i]!=nums[i-1]){
ct++;
}else{
ans+=(long long)(ct+1)*ct/2;
ct=1;
}
}
ans+=(long long)(ct+1)*ct/2;
return ans;
}
};
方法二:枚举每一个交替子数组的右端点i。
1、如果nums[i]!=nums[i-1],说明右端点i可以形成的交替子数组的数量是"右端点i-1"的数量+1个。
1、如果nums[i]==nums[i-1],说明只有一个,即它本身
class Solution {
public:
long long countAlternatingSubarrays(vector<int>& nums) {
long long ans=0;
int ct=0;
for(int i=0;i<nums.size();i++){
if(i>0&&nums[i]!=nums[i-1]){
ct++;
}else{
ct=1;
}
ans+=ct;
}
return ans;
}
};