Leetcode 1027 最长等差数列
给定一个整数数组 A
,返回 A
中最长等差子序列的长度。
回想一下,A
的子序列是列表 A[i_1]
, A[i_2]
, …, A[i_k]
其中 0 <= i_1 < i_2 < ... < i_k <= A.length - 1
。并且如果 B[i+1]
- B[i]
( 0 <= i < B.length - 1
) 的值都相同,那么序列 B 是等差的。
解题思路
二维dp,比最长上升子序列增加了表示差值的维度,即 dp[i][sub]
表示差值为 sub
的时候,第 i
个数的状态。状态转移方程为 dp[i][sub] = max(dp[i][sub] + dp[j][sub] + 1)
,其中sub = nums[i] - nums[j]
表示差值。
代码
不会写二维的Map,取巧了(逃
class Solution {
static final int maxn = 20000 + 50;
public int longestArithSeqLength(int[] nums) {
int length = nums.length;
int[][] dp = new int[length][maxn];
int ans = -1;
for (int i = 0; i < length; i++) {
for (int j = 0; j < i; j++) {
int sub = nums[i] - nums[j] + 10000;
dp[i][sub] = Math.max(dp[i][sub], dp[j][sub] + 1);
ans = Math.max(dp[i][sub], ans);
}
}
return ans + 1;
}
}