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

解题方法:等差数列求和

首先需要能看懂:

  1. 若相邻两个元素不相同,则这两个元素必定不能在一个交替子数组中。
  2. 若从lr的相邻元素都不同,则lr的任一子数组都是交替子数组

因此任务明确了。只需要将原始数组划分为若干个最长交替子数组的集合:

例如数组[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],其子数组分别为:

  • 00、从01、从02、从03,共计4个;
  • 11、从12、从13,共计3个;
  • 22、从23,共计2个;
  • 33,共计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.交替子数组计数/
作者
Tisfy
发布于
2024年7月6日
许可协议