Longest Arithmetic Subsequence of Given Difference

medium dp hash map

Problem

Given an integer array arr and an integer difference, return the length of the longest subsequence where the difference between adjacent elements equals difference.

Inputarr = [1, 5, 7, 8, 5, 3, 4, 2, 1], difference = -2
Output4
The longest such subsequence is [7, 5, 3, 1].

def longest_subsequence(arr, difference):
    dp = {}
    best = 0
    for x in arr:
        dp[x] = dp.get(x - difference, 0) + 1
        best = max(best, dp[x])
    return best
function longestSubsequence(arr, difference) {
  const dp = new Map();
  let best = 0;
  for (const x of arr) {
    const prev = dp.get(x - difference) || 0;
    dp.set(x, prev + 1);
    if (dp.get(x) > best) best = dp.get(x);
  }
  return best;
}
class Solution {
    public int longestSubsequence(int[] arr, int difference) {
        Map<Integer, Integer> dp = new HashMap<>();
        int best = 0;
        for (int x : arr) {
            int len = dp.getOrDefault(x - difference, 0) + 1;
            dp.put(x, len);
            best = Math.max(best, len);
        }
        return best;
    }
}
int longestSubsequence(vector<int>& arr, int difference) {
    unordered_map<int, int> dp;
    int best = 0;
    for (int x : arr) {
        int len = dp[x - difference] + 1;
        dp[x] = len;
        best = max(best, len);
    }
    return best;
}
Time: O(n) Space: O(n)