# 题目

给你一个整数数组  arr  和一个整数  difference ,请你找出并返回 arr  中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference

子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。

# 示例

# 示例 1

1
2
3
输入:arr = [1,2,3,4], difference = 1
输出:4
解释:最长的等差子序列是 [1,2,3,4]。

# 示例 2

1
2
3
输入:arr = [1,3,5,7], difference = 1
输出:1
解释:最长的等差子序列是任意单个元素。

# 示例 3

1
2
3
输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
输出:4
解释:最长的等差子序列是 [7,5,3,1]。

# 提示

1
2
1 <= arr.length <= 105
-104 <= arr[i], difference <= 104

# 相关题目

# 解法

# 解法一:动态规划

1
2
3
4
5
6
7
8
9
10
11
12
public int longestSubsequence(int[] arr, int difference) {
int[] dp = new int[40001];
int maxLength = 1;
int offset = 20000;
for (int i = 0; i < arr.length; i++) {
dp[arr[i] + offset] = Integer.max(1, dp[arr[i] + offset - difference] + 1);
if (maxLength < dp[arr[i] + offset]) {
maxLength = dp[arr[i] + offset];
}
}
return maxLength;
}

# 解法二:暴力解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 判断
if (arr.length == 0 || arr.length == 1) {
return arr.length;
}

int maxLength = 1;
// 最长子序列的长度数组
int t[] = new int[arr.length];

// 初始化
t[0] = 1;

// 遍历数组arr
for (int i = 1; i < arr.length; i++) {
t[i] = 1;
for (int j = i - 1; j >= 0; j--) {
if (arr[i] - difference == arr[j]) {
t[i] = t[j] + 1;
if (maxLength < t[i]) {
maxLength = t[i];
}
break;
}
}
}
return maxLength;

# 最后

期望与你一起遇见更好的自己

期望与你一起遇见更好的自己