3101.交替子数组计数
【LetMeFly】3101.交替子数组计数:等差数列求和(较详题解)
力扣题目链接:https://leetcode.cn/problems/count-alternating-subarrays/
给你一个二进制数组 nums
。
如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。
返回数组 nums
中交替子数组的数量。
示例 1:
输入: nums = [0,1,1,1]
输出: 5
解释:
以下子数组是交替子数组:[0]
、[1]
、[1]
、[1]
以及 [0,1]
。
示例 2:
输入: nums = [1,0,1,0]
输出: 10
解释:
数组的每个子数组都是交替子数组。可以统计在内的子数组共有 10 个。
提示:
1 <= nums.length <= 105
nums[i]
不是0
就是1
。
解题方法:等差数列求和
首先需要能看懂:
- 若相邻两个元素不相同,则这两个元素必定不能在一个
交替子数组
中。 - 若从
l
到r
的相邻元素都不同,则l
到r
的任一子数组都是交替子数组
。
因此任务明确了。只需要将原始数组划分为若干个最长交替子数组
的集合:
例如数组
[0, 1, 0, 0, 0, 1]
是由三个最长交替子数组
组成,
[0, 1, 0, 0, 0, 1] = [0, 1, 0] + [0] + [0, 1]
。
这样就只剩下最后一个问题:对于长度为length
的(最长交替子)数组
,一共有多少个子数组呢?
例如对于长度为4的数组
[0, 1, 0, 1]
,其下标为[0, 1, 2, 3]
,其子数组分别为:
- 从
0
到0
、从0
到1
、从0
到2
、从0
到3
,共计4
个;- 从
1
到1
、从1
到2
、从1
到3
,共计3
个;- 从
2
到2
、从2
到3
,共计2
个;- 从
3
到3
,共计1
个。子数组个数总计
1 + 2 + 3 + 4
个。长度为
length
的数组一共有$1+2+\cdots+length=\frac{(1 + length) \times length}{2}$个子数组。
至此,问题解决。
- 时间复杂度$O(len(nums))$
- 空间复杂度$O(1)$
AC代码
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/140226055
3101.交替子数组计数
https://blog.letmefly.xyz/2024/07/06/LeetCode 3101.交替子数组计数/