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的哈希表。