题目

类型:Array

image.png

解题思路

动态规划
总体思路:从左往右遍历 arr,并计算出以 arr[i] 为结尾的最长的等差子序列的长度,取所有长度的最大值,即为答案。

1、令 dp[i] 表示以 arr[i] 为结尾的最长的等差子序列的长度
2、在 arr[i] 左侧找到满足 arr[j]=arr[i]−d 的元素,将 arr[i] 加到以 arr[j] 为结尾的最长的等差子序列的末尾,这样可以递推地从 dp[j] 计算出dp[i]。由于是从左往右遍历 arr 的,对于两个相同的元素,下标较大的元素对应的 dp 值不会小于下标较小的元素对应的 dp 值,因此下标 j 可以取满足 j3、由于总是在左侧找一个最近的等于 arr[i]−d 元素并取其对应 dp 值,因此直接用 dp[v] 表示以 v 为结尾的最长的等差子序列的长度,这样dp[v−d] 就是要找的左侧元素对应的最长的等差子序列的长度,因此转移方程可以改为
dp[v]=dp[v-d]+1

最后答案为 max{dp}

代码

  1. class Solution {
  2. public int longestSubsequence(int[] arr, int difference) {
  3. int ans = 0;
  4. Map<Integer, Integer> dp = new HashMap<Integer, Integer>();
  5. for (int v : arr) {
  6. dp.put(v, dp.getOrDefault(v - difference, 0) + 1);
  7. ans = Math.max(ans, dp.get(v));
  8. }
  9. return ans;
  10. }
  11. }