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