An alternating subarray is one where no two adjacent elements are the same. We can use a sliding window to find the longest alternating segment starting at each index, and count all possible subarrays within that segment.
classSolution {
public:longlong countAlternatingSubarrays(vector<int>& nums) {
longlong ans =0;
int n = nums.size(), l =0;
while (l < n) {
int r = l +1;
while (r < n && nums[r] != nums[r-1]) ++r;
int len = r - l;
ans +=1LL* len * (len +1) /2;
l = r;
}
return ans;
}
};
classSolution {
publiclongcountAlternatingSubarrays(int[] nums) {
long ans = 0;
int n = nums.length, l = 0;
while (l < n) {
int r = l + 1;
while (r < n && nums[r]!= nums[r-1]) ++r;
int len = r - l;
ans += 1L * len * (len + 1) / 2;
l = r;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
funcountAlternatingSubarrays(nums: IntArray): Long {
var ans = 0Lval n = nums.size
var l = 0while (l < n) {
var r = l + 1while (r < n && nums[r] != nums[r-1]) r++val len = r - l
ans += len.toLong() * (len + 1) / 2 l = r
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defcountAlternatingSubarrays(self, nums: list[int]) -> int:
ans =0 n = len(nums)
l =0while l < n:
r = l +1while r < n and nums[r] != nums[r-1]:
r +=1 length = r - l
ans += length * (length +1) //2 l = r
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
impl Solution {
pubfncount_alternating_subarrays(nums: Vec<i32>) -> i64 {
let n = nums.len();
letmut ans =0i64;
letmut l =0;
while l < n {
letmut r = l +1;
while r < n && nums[r] != nums[r-1] {
r +=1;
}
let len = r - l;
ans += (len asi64) * ((len +1) asi64) /2;
l = r;
}
ans
}
}