题目描述
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
链接:https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-difference
分析
最朴素的方法,就是对每个元素,都向后遍历,看看有没有符合条件的子序列,这种方法需要等待复杂度是O(N2),很显然是会超时的
那我们可不可以一次遍历,边遍历边记录某些信息从而减小复杂度呢
举个例子
arr = [1,5,7,8,5,3,4,2,1], difference = -2
我们注意到,假如要计算到3了,我们如果知道了3前面有没有5并且以5结尾的子序列长度,不就可以知道3结尾的子序列的长度了。
那我们又想能迅速的查到具体的值,很明显地要用哈希表了
具体怎么记录也很简单,需要什么记录什么
键为i的表示以i结尾的最长等差子序列的长度,那么我们遍历到i的时候,只需要看看有没有i-difference的值就行了,如果有,就+1并记录到哈希表,如果没有说明如果以它结尾的字序列只可能是它自身了,就直接哈希表置为1
代码
class Solution:
def longestSubsequence(self, arr: List[int], difference: int) -> int:
hashmap={}
for i in arr:
if i-difference in hashmap:
hashmap[i] = hashmap[i-difference]+1
else:
hashmap[i] = 1
ans = 0
for i in hashmap.items():
ans = max(ans,i[1])
return ans