1218. Longest Arithmetic Subsequence of Given Difference

1218. Longest Arithmetic Subsequence of Given Difference

Difficulty: 中等

Given an integer array arr and an integer <font face="monospace" style="display: inline;">difference</font>, 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.

Example 1:

Input: arr = [1,2,3,4], difference = 1
Output: 4
Explanation: The longest arithmetic subsequence is [1,2,3,4].

Example 2:

Input: arr = [1,3,5,7], difference = 1
Output: 1
Explanation: The longest arithmetic subsequence is any single element.

Example 3:

Input: arr = [1,5,7,8,5,3,4,2,1], difference = -2
Output: 4
Explanation: The longest arithmetic subsequence is [7,5,3,1].

Constraints:

  • 1 <= arr.length <= 10^5
  • -10^4 <= arr[i], difference <= 10^4

Solution

Language: Python3

​class Solution:
    def longestSubsequence(self, arr: List[int], difference: int) -> int:
        dict_arr={}
        rep=0
        for num in arr:
            if num-difference not in dict_arr:
                dict_arr[num]=1
            else:
                dict_arr[num]=1+dict_arr[num-difference]
            rep=max(rep,dict_arr[num])
        return rep

Solution

Language: Python3

class Solution:
    def longestSubsequence(self, arr: List[int], difference: int) -> int:
        dict_arr={}
        for k in range(len(arr)):
            if arr[k] not in dict_arr:
                dict_arr[arr[k]]=[k]
            else:
                dict_arr[arr[k]].append(k)
        
        rep=0
        used_num=set()
        
        for k in range(len(arr)):
            if arr[k] in used_num:
                continue
                
            used_num.add(arr[k])
            cnt=1
            cur=arr[k]
            loc=k
            while cur+difference in dict_arr and dict_arr[cur+difference][-1]>loc:
                used_num.add(cur+difference)
                cnt+=1
                loc=self.searchMinLocLargerThenK(dict_arr[cur+difference],loc)
                cur+=difference
            rep=max(rep,cnt)
        return rep
    
    def searchMinLocLargerThenK(self,nums,k):
        l,r=0,len(nums)-1
        while l<=r:
            mid=(l+r)//2
            if nums[mid]>k:
                r=mid-1
            else:
                l=mid+1
        return nums[l]

Leave a comment