📜  (x,x,x + 1,x + 1)形式的长度为4的子序列数|套装2(1)

📅  最后修改于: 2023-12-03 15:13:03.226000             🧑  作者: Mango

套装2题解

本题是求给定长度为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