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

匿名 (未验证) 提交于 2019-12-03 00:13:02

arrdifferencearrdifference.

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

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

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

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

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

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

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

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

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

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

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;     } };

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!