給你一個(gè)整數(shù)數(shù)組 arr 和一個(gè)整數(shù) difference,請(qǐng)你找出 arr 中所有相鄰元素之間的差等于給定 difference 的等差子序列,并返回其中最長(zhǎng)的等差子序列的長(zhǎng)度。
示例1
輸入:arr = [1,2,3,4], difference = 1
輸出:4
解釋:最長(zhǎng)的等差子序列是 [1,2,3,4]。
示例2
輸入:arr = [1,3,5,7], difference = 1
輸出:1
解釋:最長(zhǎng)的等差子序列是任意單個(gè)元素。
示例3
輸入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
輸出:4
解釋:最長(zhǎng)的等差子序列是 [7,5,3,1]。
提示:
- 1 <= arr.length <= 10^5
- -10^4 <= arr[i], difference <= 10^4
該題需要注意的地方為:
- 要按照數(shù)組本來(lái)的順序,不能對(duì)數(shù)組進(jìn)行排序操作
在解題時(shí),我自己的想法是外面一個(gè)循環(huán),里面再?gòu)漠?dāng)前元素出發(fā),尋找當(dāng)前元素的等差數(shù)列,雖然有對(duì)使用過(guò)的元素進(jìn)行標(biāo)記,不再循環(huán),但是依然是將近O(n*n)的復(fù)雜度。我朋友的想法就是使用Map數(shù)組來(lái)存儲(chǔ)每個(gè)元素的等差數(shù)列長(zhǎng)度,只需要一層循環(huán),在循環(huán)時(shí),查找Map數(shù)組中是否有當(dāng)前元素的前一項(xiàng),如果有,取出前一項(xiàng)的等差數(shù)列的長(zhǎng)度,將這個(gè)長(zhǎng)度加1就是當(dāng)前元素的等差數(shù)列的長(zhǎng)度。最后只需要找出Map數(shù)組中等差數(shù)列長(zhǎng)度的最大值了。由于Map數(shù)組查找的算法復(fù)雜度為O(logn),因此總體的算法復(fù)雜度為O(nlogn)。
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
map<int,int> storeMap;
for(int i=0;i<arr.size();i++){
int preValue = arr[i] - difference;
auto iter = storeMap.find(preValue);
if(iter != storeMap.end()){
auto iter2 = storeMap.find(arr[i]);
if(iter2 != storeMap.end()){
iter2->second = iter->second+1;
}
else{
storeMap.insert(pair<int,int>(arr[i], iter->second + 1));
}
}
else{
storeMap.insert(pair<int,int>(arr[i], 1));
}
}
int max_len = 1;
for(auto iter=storeMap.begin();iter!=storeMap.end();iter++){
if(iter->second > max_len){
max_len = iter->second;
}
}
return max_len;
}
};