給你一個整數數組 arr 和一個整數 difference,請你找出 arr 中所有相鄰元素之間的差等於給定 difference 的等差子序列,並返回其中最長的等差子序列的長度。
示例 1:
輸入:arr = [1,2,3,4], difference = 1
輸出:4
解釋:最長的等差子序列是 [1,2,3,4]。
示例 2:
輸入:arr = [1,3,5,7], difference = 1
輸出:1
解釋:最長的等差子序列是任意單個元素。
示例 3:
輸入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
輸出:4
解釋:最長的等差子序列是 [7,5,3,1]。
提示:
1 <= arr.length <= 10^5
-10^4 <= arr[i], difference <= 10^4
如果只需要O(n^2)的算法,那就太簡單了,那就和 力扣 OJ 300. 最長上升子序列
https://blog.csdn.net/nameofcsdn/article/details/104086350 沒有什麼區別,
直接微改得到的代碼是這樣的:
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
map<int, int>ans;
ans[0] = 1;
for (int i = 1; i < arr.size(); i++)
{
ans[i] = 1;
for (int j = 0; j < i; j++)
if (arr[j]+difference == arr[i] && ans[i] < ans[j] + 1)ans[i] = ans[j] + 1;
}
int m = 0;
for (int i = 0; i < arr.size(); i++)if (m < ans[i])m = ans[i];
return m;
}
};
果然超時。
這個題目明顯需要O(n)的算法,
思路還是一樣,只需要基於數據結構進行時間優化即可
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
map<int, int>ans;
int res=0;
for (int i = 0; i < arr.size(); i++)
{
ans[arr[i]]=max(ans[arr[i]],ans[arr[i]-difference]+1);
res=max(res,ans[arr[i]]);
}
return res;
}
};