一、题目地址
https://leetcode-cn.com/problems/longest-arithmetic-subsequence/
二、具体代码
/**
* @param {number[]} nums
* @return {number}
*/
// 改进后的动态规划做法
// 时间复杂度: O(n^2)
// 空间复杂度: O(n)
var longestArithSeqLength = function(nums) {
let n = nums.length;
// 1、最短的等差数列长度至少都有两个,所以fill(2)
let dp = Array.from(new Array(n), () => new Array(n).fill(2));
let map = new Map();
let res = 0;
for(let i=0; i<n; i++) {
for(let j=i+1; j<n; j++) {
let target = 2 * nums[i] - nums[j];
// 2、使用三层for循环会超时,所以使用map代替第三层循环
// for(let k=i-1; k>=0; k--) {
// if(nums[k] === target) {
// dp[i][j] = dp[k][i] + 1;
// break;
// }
// }
if(map.has(target)) {
let tempIndex = map.get(target);
dp[i][j] = dp[tempIndex][i] + 1;
}
res = Math.max(res, dp[i][j]);
}
map.set(nums[i], i);
}
return res;
};