最长递增子序列(LIS)的变种

26 阅读1分钟

题目描述:给定一个整数数组 nums,要求找出该数组中最长的递增子序列(LIS)的长度,但有一个额外条件:LIS中的任意两个相邻元素必须不相等。

答案提示:

使用动态规划,但状态转移方程需要考虑当前元素与前一个LIS中元素不相等的情况。 可以利用哈希表来优化查找过程,减少时间复杂度。

### 1. 最长递增子序列(LIS)的变种(相邻元素不相等)
def lengthOfLIS(nums):
    if not nums:
        return 0
    n = len(nums)
    dp = [1] * n
    for i in range(n):
        for j in range(i):
            if nums[j] < nums[i] and (j + 1 >= i or nums[i]!= nums[j + 1]):
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(lengthOfLIS(nums)) 
### 输出 4