暴力枚举方法,枚举数组的开头
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
int n = arr.size();
int res = 1;
for (int i = 0; i < n; i++) {
int prev = arr[i];
int len = 1;
for (int j = i + 1; j < n; j++) {
int now = arr[j];
if (now - prev == difference) {
len++;
prev = arr[j];
res = max(res, len);
}
}
}
return res;
}
};
如果我们用dp[i]表示以第i个数组元素结尾的最长等差序列,这样转移还是O(n^2)的,但是如果用dp[v]表示以v数结尾的等差数列子数组的长度,就能优化到O(N)
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
int res = 0;
unordered_map<int, int> dp;
for (auto v : arr) {
dp[v] = dp[v - difference] + 1;
res = max(res, dp[v]);
}
return res;
}
};