# 题目
给你一个整数数组 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
|
# 相关题目
力扣(LeetCode)1218.最长定差子序列
https://leetcode-cn.com/
# 解法
# 解法一:动态规划
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;
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;
|
# 最后
期望与你一起遇见更好的自己
扫码或搜索:方家小白
发送 290992
即可立即永久解锁本站全部文章