📅  最后修改于: 2023-12-03 14:55:23.054000             🧑  作者: Mango
给定一个整数序列,找到其中最长的子序列,使得其中任意两个元素之间的绝对差不超过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。