1218 最长定差子序列(动态规划)

1. 问题描述:

给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度。

示例 1:

输入:arr = [1,2,3,4], difference = 1
输出:4
解释:最长的等差子序列是 [1,2,3,4]

示例 2:

输入:arr = [1,3,5,7], difference = 1
输出:1
解释:最长的等差子序列是任意单个元素

示例 3:

输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
输出:4
解释:最长的等差子序列是 [7,5,3,1]

2. 思路分析:

① 一开始的时候感觉这个应该使用的是动态规划来解决,但是具体怎么样实现还是没有思路,感觉这个动态规划的难点就在于怎么样弄清楚这个状态转移还有就是dp数组具体的含义,看了一下题解之后dp数组可以为当前数字为结尾的最长子序列的长度,这个含义实际上就是核心了

② 因为使用的是python语言来解决的,所以可以声明一个dict字典来存储,键为当前的关键字,值为当前的关键字结尾的最长子序列的长度,我们可以遍历给出的整数列表,检查以当前数字为结尾是否存在等差序列的上一个数字,如果存在说明可以构成更长的的等差序列,所以在上一个等差序列的数字的长度上加1即可,不存在那么表示以当前数字结尾的最大子序列的长度为1

③ 使用python语言在赋值的时候可以使用if判断表达式来限制具体的赋值条件,可以使得代码简洁一点,感觉想清楚了动态规划的dp数组的含义那么代码实现起来还是比较简单的,在平时的时候可以多做一下这样的题目锻炼一下思维能力

3. 代码如下:

class Solution:
    def longestSubsequence(self, arr: List[int], difference: int) -> int:
        # 创建一个空的字典
        dp = dict()
        for num in arr:
            # 使用python比较好的一点是在赋值的时候可以使用if判断表达式
            dp[num] = (dp[num - difference] if num - difference in dp else 0) + 1
        return max(dp.values())

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/107352435