arr
difference
arr
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>记录结束于某元素的最长序列长度。遍历数组:
这里,如果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; } };
来源:博客园
作者:rarecu
链接:https://www.cnblogs.com/rarecu/p/11631965.html