📅  最后修改于: 2023-12-03 15:13:03.226000             🧑  作者: Mango
本题是求给定长度为n的序列中,有多少个子序列满足形式为(x, x, x+1, x+1)。
显然,我们需要遍历原始序列,对于每个位置i,判定以i为起点的所有长度为4的子序列。
具体地,我们用一个计数器cnt记录满足条件的子序列数量,对于当前正在考虑的位置i,我们枚举所有以i为起点的长度为4的子序列。
朴素实现需要O(n^2)时间复杂度,但可以在O(n)时间复杂度内实现。每当寻找到一个满足条件的子序列时,我们将cnt加上能够在i之前(包括i)找到x或x+1的位置数量,即为子序列种类数。
def countSubseq(nums: List[int]) -> int:
"""
:param nums: 长度为n的序列,数据类型为list[int]
:return: 序列中形如(x, x, x+1, x+1)的子序列数量,数据类型为int
"""
cnt = 0
l = len(nums)
for i in range(l - 3):
if nums[i] == nums[i + 1] and nums[i + 2] == nums[i + 3] and nums[i] != nums[i + 2]:
cnt += nums[:i + 1].count(nums[i])
cnt += nums[:i + 1].count(nums[i] + 1)
cnt += nums[:i + 1].count(nums[i + 2])
cnt += nums[i + 2:].count(nums[i + 2])
cnt += nums[i + 2:].count(nums[i + 2] - 1)
return cnt
代码注释中说明了函数输入输出的数据类型,函数的名称为countSubseq
。