5214. 最长定差子序列
显示英文描述
- 用户通过次数310
- 用户尝试次数642
- 通过次数317
- 提交次数1712
- 题目难度Medium
给你一个整数数组 arr
和一个整数 difference
,请你找出 arr
中所有相邻元素之间的差等于给定 difference
的等差子序列,并返回其中最长的等差子序列的长度。
示例 1:
输入:arr = [1,2,3,4], difference = 1 输出:4 解释:最长的等差子序列是 [1,2,3,4]。
示例 2:
输入:arr = [1,3,5,7], difference = 1 输出:1 解释:最长的等差子序列是任意单个元素。
示例 3:
输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2 输出:4 解释:最长的等差子序列是 [7,5,3,1]。
提示:
1 <= arr.length <= 10^5
-10^4 <= arr[i], difference <= 10^4
思路:放一下我在LeetCode上写的题解:我的题解
思路:
我们设dp[i]表示当前序列最后一个数是i的最大子序列长度
递推方程很简单:dp[i]=max(dp[i],dp[i-difference]+1);
因为i可能是负数,因此我们将每个数加10000,保证所有数非负即可!
class Solution {
public int longestSubsequence(int[] arr, int difference) {
int[] dp=new int[20005];
for(int i=0;i<arr.length;i++)
arr[i]+=10000;
int ans=0;
for(int i=0;i<arr.length;i++)
{
int sum=arr[i]-difference;
if(sum<0 || sum>20000)
dp[arr[i]]=1;
else
dp[arr[i]]=Math.max(dp[arr[i]],dp[sum]+1);
ans=Math.max(ans, dp[arr[i]]);
}
return ans;
}
}