题目描述
Given an integer array arr and an integer difference, return the length of the longest subsequence in arr which is an arithmetic sequence such that the difference between adjacent elements in the subsequence equals difference.
Example 1:
Input: arr = [1,2,3,4], difference = 1
Output: 4
Explanation: The longest arithmetic subsequence is [1,2,3,4].
Example 2:
Input: arr = [1,3,5,7], difference = 1
Output: 1
Explanation: The longest arithmetic subsequence is any single element.
Example 3:
Input: arr = [1,5,7,8,5,3,4,2,1], difference = -2
Output: 4
Explanation: The longest arithmetic subsequence is [7,5,3,1].
Constraints:
1 <= arr.length <= 10^5
-10^4 <= arr[i], difference <= 10^4
思路
动态规划。mp[i] 表示以数字num[i] 结尾的等差数列长度。新的数字num,如果num-diff出现过,说明可以接在num-diff后面构成新的数列, mp[num] = max(mp[num], mp[num-diff]+1)。否则为1。
代码
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
int n = arr.size();
unordered_map<int, int> mp;
int res = 1;
for (auto num : arr) {
if (mp.count(num-difference))
mp[num] = max(mp[num], mp[num-difference]+1);
else mp[num] = 1;
res = max(mp[num], res);
}
return res;
}
};
今天也是产出超低的一天。。。脑阔痛。

本文介绍了一种使用动态规划求解最长等差子序列的方法,通过实例展示了如何找到数组中等差序列的最大长度,适用于算法设计与分析的学习者。
291

被折叠的 条评论
为什么被折叠?



