📅  最后修改于: 2023-12-03 15:06:40.886000             🧑  作者: Mango
给定一个整数数组,返回以相同元素开始和结束的子数组的数量。
例如,给定数组 [1,2,1,2,1],返回 4,因为有 4 个子数组以 1 开头和以 1 结尾:[1,2,1], [1,2,1,2,1], [1], 和 [1,2,1].
我们可以从左往右遍历数组,记录下以每个元素为开始的子数组个数,然后再从右往左遍历数组,记录下以每个元素为结束的子数组个数,最终将这些计数相乘并累加即可。
举个例子,对于数组 [1,2,1,2,1]:
因此,以相同元素开始和结束的子数组的数量就是 3 * 2 = 6 个。但是我们要去掉不以任何元素开始或结束的子数组,所以最终的结果是 6 - 5 = 1 个。
以下是 Python 代码实现:
def count_subarrays(nums):
n = len(nums)
left = [0] * n
right = [0] * n
# 从左往右遍历数组,记录下以每个元素为开始的子数组个数
for i in range(n):
if i == 0 or nums[i] != nums[i - 1]:
left[i] = 1
else:
left[i] = left[i - 1] + 1
# 从右往左遍历数组,记录下以每个元素为结束的子数组个数
for i in range(n - 1, -1, -1):
if i == n - 1 or nums[i] != nums[i + 1]:
right[i] = 1
else:
right[i] = right[i + 1] + 1
# 将这些计数相乘并累加
result = 0
for i in range(n):
if left[i] > 0 and right[i] > 0:
result += left[i] * right[i]
# 去掉不以任何元素开始或结束的子数组
for i in range(1, n - 1):
if nums[i - 1] == nums[i + 1] and nums[i] != nums[i - 1] and left[i - 1] > 0 and right[i + 1] > 0:
result -= left[i - 1] * right[i + 1]
return result
本算法的时间复杂度为 O(n),其中 n 是数组的长度。空间复杂度也为 O(n),需要使用两个数组来记录子数组的计数。