-
建立二维数组,遍历目标数组arr,
-
一层遍历
for (var i = 1; i < n; i++) { -
两层遍历
for (var j = 0; j < i; j++) { -
dp[i][j]其中i>j,意思就是说当遍历到第i个数字了,然后求出i的左侧形成的斐波拉契的长度,这里有个最低默认值为2 -
如果没有找到一个合适的i,和它的左侧形成斐波拉契,那么返回res为0了
代码实现
var lenLongestFibSubseq = function (arr) {
const n = arr.length;
var dp = new Array(n);
var map = new Map();
for (var i = 0; i < n; i++) {
map.set(arr[i], i);
dp[i] = [];
}
var res = 0;
for (var i = 1; i < n; i++) {
for (var j = 0; j < i; j++) {
var k = map.get(arr[i] - arr[j]);
if (k < j) {
dp[i][j] = dp[j][k] + 1;
if (dp[i][j] > res) {
res = dp[i][j];
}
} else {
dp[i][j] = 2;
}
}
}
return res;
};
代码调试
console.log(lenLongestFibSubseq([1, 3, 7, 11, 12, 14, 18]));