剑指 Offer II 093. 最长斐波那契数列

84 阅读1分钟

剑指 Offer II 093. 最长斐波那契数列

  • 建立二维数组,遍历目标数组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]));

image.png