📜  最长子序列,使得每对之间的绝对差最大为1(1)

📅  最后修改于: 2023-12-03 14:55:23.054000             🧑  作者: Mango

最长子序列,使得每对之间的绝对差最大为1

问题描述

给定一个整数序列,找到其中最长的子序列,使得其中任意两个元素之间的绝对差不超过1。

问题分析
解法一:暴力枚举

如果直接枚举所有可能的子序列,并检查其中的绝对差是否不超过1,时间复杂度为$O(2^n)$,无法通过本题。

解法二:动态规划

考虑用动态规划求解本题。

首先将原序列排序,便于处理。

设$dp[i]$为以第$i$个元素为结尾的最长子序列的长度。则转移方程可以表示为:

$$ dp[i] = \max{dp[j] + 1},\quad 0\leq j<i,\quad |a_i-a_j|\leq 1 $$

在转移过程中记录最大的$dp$值即可。时间复杂度为$O(n^2)$,可以通过本题。

代码:

def longest_subsequence(nums):
    n = len(nums)
    dp = [1] * n
    for i in range(1, n):
        for j in range(i):
            if abs(nums[i] - nums[j]) <= 1:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)
总结

本题可以用动态规划求解,时间复杂度为$O(n^2)$。

注意在状态转移时,需要判断前一个元素和当前元素的差是否不超过1。

参考资料
  1. LeetCode题目链接