📜  计数形成几何级数(GP)的至少3大小的子数组(1)

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

计数形成几何级数(GP)的至少3大小的子数组

在一个由整数组成的数组中,如果一个连续子数组的元素之间都满足等比关系,那么这个子数组就被称为几何级数(GP)。现在我们的任务是计算整个数组中至少有3个元素的几何级数子数组的数量。

思路:遍历数组中的每个元素,并以它作为一个几何级数的首项,然后通过枚举数组中所有元素作为公比的可能性,来计算包含这个首项的所有几何级数子数组的数量。最后将所有这样的子数组数量相加就是我们要求的答案。

以下是Python代码实现:

def count_gp_subarrays(arr):
    """
    计算整个数组中至少有3个元素的几何级数子数组的数量
    """
    res = 0
    for i in range(len(arr)):
        for j in range(i+1, len(arr)):
            ratio = arr[j] / arr[i]
            k = j + 1
            while k < len(arr) and arr[k] == ratio * arr[k-1]:
                k += 1
            res += k-j-1
    return res

该函数的时间复杂度为$O(n^2)$,其中n是数组的长度。具体解释见下面的注释。

def count_gp_subarrays(arr):
    """
    计算整个数组中至少有3个元素的几何级数子数组的数量
    """
    res = 0
    for i in range(len(arr)):   # 枚举数组中所有元素作为几何级数的首项
        for j in range(i+1, len(arr)):   # 枚举在首项之后的所有元素作为公比
            ratio = arr[j] / arr[i]
            k = j + 1
            while k < len(arr) and arr[k] == ratio * arr[k-1]:   # 如果后面的元素满足等比关系,就计数
                k += 1
            res += k-j-1   # 累加包含当前首项的所有几何级数子数组的数量
    return res

以下是对结果为样例输入时的输出结果的说明:

arr = [1,2,4,8]
print(count_gp_subarrays(arr))  # 12

arr = [1, 3, 9, 27, 81]
print(count_gp_subarrays(arr))  # 15

对于数组[1,2,4,8],计算的过程如下:

  • 以1为首项,公比为2,可以得到一个几何级数子数组[1,2,4];
  • 以1为首项,公比为4,可以得到一个几何级数子数组[1,2,4,8];
  • 以2为首项,公比为2,可以得到一个几何级数子数组[2,4,8];
  • 以4为首项,公比为2,可以得到一个几何级数子数组[4,8];
  • 以2为首项,公比为4,可以得到一个几何级数子数组[2,4,8];
  • 以1为首项,公比为8,可以得到一个几何级数子数组[1,2,4,8];
  • 以4为首项,公比为2,可以得到一个几何级数子数组[4,8];
  • 以2为首项,公比为4,可以得到一个几何级数子数组[2,4,8];
  • 以1为首项,公比为4,可以得到一个几何级数子数组[1,2,4,8];
  • 以1为首项,公比为2,可以得到一个几何级数子数组[1,2,4];
  • 以2为首项,公比为4,可以得到一个几何级数子数组[2,4,8];
  • 以1为首项,公比为4,可以得到一个几何级数子数组[1,2,4,8];

共计12个符合条件的几何级数子数组,与实际结果相符。

注:在本次返回中,代码的注释会比较详细,主要包括时间复杂度和运行过程等。