1218. 最长定差子序列
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
示例 1:
1 | 输入:arr = [1,2,3,4], difference = 1 |
示例 2:
1 | 输入:arr = [1,3,5,7], difference = 1 |
示例 3:
1 | 输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2 |
提示:
1 <= arr.length <= 105-104 <= arr[i], difference <= 104
题解:
动态规划
当前数字num所能构成的最长定差子序列的长度由num - difference所能构成的最长定差子序列长度决定。
使用dp[i]来表示以第i个元素为结尾的最长等差子序列的长度,可以通过等差公式:arr[i] - diffience = arr[j],找到左侧的前一个以arr[j]为结尾的最长定差子序列,将arr[i]加到该子序列中,就可以根据dp[j]递推出dp[i]。
状态转移方程为:
dp[i] = dp[i- difference] + 1
1 | public int longestSubsequence(int[] arr, int difference) { |
- 时间复杂度:O(N),需要对数组进行遍历。
- 空间复杂度:O(N),使用到了元素个数为N的哈希表。

