题目描述
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
思路
一开始,直接两重循环判断每个数形成的等差数列的长度,由于时间复杂度过高,转换思路。考虑每个数字结尾的等差数列的长度配以字典的记录方式,这样能减少大量的循环。
具体思路如下:
以字典 dp为存储方式,dp[num] 表示以数字num为结尾的最长的等差子序列的长度。
那么,对于数组中数字arr[i]有,dp[arr[i]] = dp[arr[i] - difference]
其中,python3中字典的每个键值 key => value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中,格式:
d = {key1 : value1, key2 : value2, key3 : value3 }
class Solution:
def longestSubsequence(self, arr: List[int], difference: int) -> int:
dicts = {}
for i in range(len(arr)):
if arr[i]-difference in dicts:
dicts[arr[i]] = dicts[arr[i]-difference] + 1
else:
dicts[arr[i]] = 1
return max(dicts.values())