📌  相关文章
📜  给定数组中最长的素数子序列的长度(1)

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

给定数组中最长的素数子序列的长度

素数是指只能被1和自身整除的正整数,如2、3、5、7、11等。给定一个数组,寻找其中最长的素数子序列,并返回其长度。

解题思路
  1. 定义一个函数 is_prime(num),用来判断一个数是否为素数。

  2. 遍历数组,对于每一个元素,以它为开头,向后检查是否有连续的素数,并计算素数序列的长度,取最大值。

代码实现
def is_prime(num):
    """
    判断一个数是否为素数
    """
    if num < 2:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True


def longest_prime_subsequence_length(arr):
    """
    给定数组中最长的素数子序列的长度
    """
    max_len = 0  # 最长素数序列的长度
    i = 0
    while i < len(arr):
        if not is_prime(arr[i]):
            i += 1
            continue
        j = i
        while j < len(arr) and is_prime(arr[j]):
            j += 1
        max_len = max(max_len, j - i)
        i = j
    return max_len
测试样例
assert longest_prime_subsequence_length([1, 2, 3, 4, 5, 7, 8, 11]) == 4
assert longest_prime_subsequence_length([2, 3, 5, 7, 11]) == 5
assert longest_prime_subsequence_length([4, 6, 8, 9]) == 0
时间复杂度分析

时间复杂度为 $O(n \sqrt{n})$,其中 n 是数组的长度。因为在判断一个数是否为素数时,需要遍历它的所有因数,因此时间复杂度为 $\sqrt{n}$。因为要遍历数组中所有的元素,因此总时间复杂度为 $O(n \sqrt{n})$。