题目:
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
解答:
class Solution:
def longestSubsequence(self, arr: List[int], difference: int) -> int:
dic=defaultdict(list)
for i,num in enumerate(arr):
dic[num].append(i)
print(dic)
#dp[i][j](j非0即1) 为代表考虑前 i个数,且第 i个数的选择情况为j 时,得到的最长定差子序列长度。
n=len(arr)
dp=[[0]*2 for _ in range(n)]
dp[0][1]=1
for i in range(1,n):
dp[i][0]=max(dp[i-1][0],dp[i-1][1])
tmp=arr[i]-difference
cur=dic[tmp]
t=len(cur)
tmp_idx=-1
for j in range(t):
if cur[j]<i:
tmp_idx=cur[j]
else:
break
#当前数之前不存在tmp
if t==0 or tmp_idx==-1:
dp[i][1]=1
else:
dp[i][1]=dp[tmp_idx][1]+1
#print(i,arr[i],tmp,tmp_idx,dp[i])
return max(dp[n-1][0],dp[n-1][1])