1218.最长定差子序列

一、dp

求”最长”、“最短”这种,下意识用dp

dp[i]表示arr中[0, i]部分最长定差子序列的长度,每次用j遍历[0, i-1],若有arr[j] = arr[i] - d,则dp[i] = dp[j] + 1

class Solution:
    def longestSubsequence(self, arr, difference) -> int:
        n = len(arr)
        dp = [1] * n
        res = 0
        for i in range(1, n):
            for j in range(0, i):
                if arr[j] == arr[i] - difference:
                    dp[i] = dp[j] + 1
            res = max(res, dp[i])
        return res

然而这样超时,复杂度O(n^2)。其实并没有利用好dp的性质,即从一个状态立即推出另一个状态,而不是求dp[i]还要循环遍历

改进

直接用dp[v]表示以v(元素值,而非下标)结尾的最长等差子序列长度, 为保证序列性,从前向后遍历,易知dp[v] = dp[v-d] + 1

初始情况为dp[v]=0,即v不在arr中

最后求dp[v]的最大值

class Solution:
    def longestSubsequence(self, arr, difference) -> int:
        dp = {}
        res = 0
        for num in arr:
            dp[num] = dp.get(num - difference, 0) + 1
        for key in dp:
            res = max(res, dp[key])
        return res

最后更新于