https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-difference/
思路:其实和最长上升子序列是很像的,考虑
d
p
i
dp_i
dpi表示以
a
i
a_i
ai结尾的最长等差子序列的长度,那么当
j
<
i
j<i
j<i且
a
j
=
a
i
+
d
a_j=a_i+d
aj=ai+d时有
d
p
i
=
m
a
x
(
d
p
i
,
d
p
j
+
1
)
dp_i=max(dp_i,dp_j+1)
dpi=max(dpi,dpj+1),但是这样做的复杂度是
O
(
n
2
)
O(n^2)
O(n2)的,喜提TLE。我们可以仔细观察一下转移方程,其实时间主要浪费在寻找
a
j
=
a
i
+
d
a_j=a_i+d
aj=ai+d上,用哈希优化一下这个过程不就行了么。可以用
d
p
i
dp_i
dpi表示以
i
i
i结尾的最长等差子序列的长度,那么对于任意一个元素
e
e
e,有
d
p
e
=
d
p
e
−
d
+
1
dp_{e}=dp_{e-d}+1
dpe=dpe−d+1。
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
unordered_map<int,int> dp;
int ans=0;
for(int ele:arr)
{
dp[ele]=dp[ele-difference]+1;
ans=max(dp[ele], ans);
}
return ans;
}
};