题意:给定一个数组,找出最长的等差数列
思路:
- 遍历数组,找出最大值和最小值
- 设定dp数组,dp[i][j]记录的是index i以及它之前的数组,构成值为j的最长等差数列长度,
- dp数组的,rowchang是数组长度,j是最大最小值的差值*2+1,因为需要考虑两个数的差的正负,以及0
- 遍历数组,以及每一数子和它前边数子的差,并把结果记录到dp中,dp[i][j] = dp[i-1][j] + 1
思想:动态规划
复杂度:时间O(n2),空间O(n2)
class Solution {
public int longestArithSeqLength(int[] A) {
int len = A.length;
if(len == 0)
return 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i=0;i<A.length;i++) {
max = Math.max(A[i], max);
min = Math.min(A[i], min);
}
int sum = max - min;
int[][] dp = new int[len][(max - min) * 2 + 1];
int res = 1;
for(int i=0;i<len;i++) {
for(int j=0;j<i;j++) {
int diff = sum + A[j] - A[i];
dp[i][diff] = dp[j][diff] + 1;
res = Math.max(res, dp[i][diff]);
}
}
return res + 1;
}
}