【DP?】1218. Longest Arithmetic Subsequence of Given Difference

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.

思路:直观的思路是,先用一个map记住所有出现的数字的索引号,然后从头遍历数组,遇到每一个数的时候,用一个指针指向序列的下一个数,直到序列结束,记录这个序列的长度,对每一个元素都这样做。比如,

【1,3,2,5,7,6,5,3,1】 -2

从元素1开始,序列的下一个数是-1,但不存在。pass

元素3,序列下一个数是1,指针指向最后一个1,然后序列结束,长度为2.

以此类推,找到最大长度。

这个思路可以pass36/38的数据,但是会TLE。

 

更好的思路是,用一个map<int,int>记录结束于某元素的最长序列长度。遍历数组:

map[arr[i]] = map[arr[i]-difference]+1 

这里,如果arr[i]-difference即序列中的上一个元素不存在,则为0+1=1,是一个元素的长度。

如果上一个元素存在,则序列长度就是结束于上一个元素的长度加一。

【1,3,2,5,7,6,5,3,1】 -2

=> [ 1,  1,  1,  1,  1, 1, 2, 3, 4]

map的最大值就是最长序列。

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        map<int,int > count;
        int answer=1;
        for(int i=0;i<arr.size();i++){
                count[arr[i]]=1+count[arr[i]-difference];
                answer=max(answer,count[arr[i]]);
        }
       
        return answer;
    }
};

 

posted @ 2019-10-07 20:03  rarecu  阅读(158)  评论(0编辑  收藏  举报