📜  数组的边界元素可能的最长递增序列(1)

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

数组的边界元素可能的最长递增序列

在一个数组中,边界元素是指第一个元素和最后一个元素。现在给定一个数组,要求找出数组所有可能的边界元素组成的最长递增序列。

问题描述

给定一个长度为 $n (1 \leq n \leq 10^5)$ 的数组 $a$,$a_i$ 表示这个数组中第 $i$ 个元素的值。请编写一个函数,找出所有可能的边界元素组成的最长递增序列的长度。

如果该数组只有一个元素,那么这个数组的所有元素都是边界元素,最长递增序列长度为 $1$。

解题思路

将问题转化为求该数组的最长公共上升子序列长度。即求出原数组正序和倒序两个序列的最长上升子序列之和减一,其中减一是因为正序和倒序的重叠部分被重复计算了。

具体实现可使用动态规划,时间复杂度为 $O(n^2)$。

代码实现
def LIS(a: list) -> int:
    """
    求最长上升子序列的长度
    """
    n = len(a)
    dp = [1] * n
    for i in range(1, n):
        for j in range(i):
            if a[j] < a[i]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

def boundaryLIS(a: list) -> int:
    """
    求边界元素可能的最长递增序列长度
    """
    inc_len = LIS(a)
    rev_inc_len = LIS(a[::-1])
    return inc_len + rev_inc_len - 1
测试示例
assert boundaryLIS([1, 2, 3, 4, 3, 4, 5, 6, 7]) == 7
assert boundaryLIS([1, 2, 3, 4, 5]) == 5
assert boundaryLIS([5, 4, 3, 2, 1]) == 1