【问题标题】:When adding cache to my longest increasing subsequence solution, answer is not correct?将缓存添加到我的最长递增子序列解决方案时,答案不正确?
【发布时间】:2022-01-09 12:30:25
【问题描述】:

我正在处理https://leetcode.com/problems/longest-increasing-subsequence

测试用例

input: [5, 4, 19, 5, 7, 12]; output: 4

没有缓存,我可以正确输出4。

var lengthOfLIS = function (ns) {
  if (ns.length === 1) return 1;

  const prev_i = -1;
  const curr_i = 0;
  const res = 0;
  return recur(ns, prev_i, curr_i, res);
};

// good
var recur = function (ns, prev_i, curr_i, res) {
  //
  if (curr_i >= ns.length) {
    return res;
  }

  // take
  let out_1 = 0;
  if (prev_i === -1) {
    out_1 = recur(ns, curr_i, curr_i + 1, res + 1);
  } else if (ns[curr_i] > ns[prev_i]) {
    out_1 = recur(ns, curr_i, curr_i + 1, res + 1);
  } else if (ns[curr_i] <= ns[prev_i]) {
    out_1 = res;
  }

  // !take
  let out_2 = 0;
  out_2 = recur(ns, prev_i, curr_i + 1, res);

  const max = Math.max(out_1, out_2);
  return max;
};

当我向它添加缓存时,我的输出是 3。

var recur = function (dp, ns, prev_i, curr_i, res) {
  //
  if (curr_i >= ns.length) {
    return res;
  }

  if (prev_i !== -1 && dp[prev_i + 1][curr_i + 1] !== undefined) {
    return dp[prev_i + 1][curr_i + 1];
  }

  // take
  let out_1 = 0;
  if (prev_i === -1) {
    out_1 = recur(dp, ns, curr_i, curr_i + 1, res + 1);
  } else if (ns[curr_i] > ns[prev_i]) {
    out_1 = recur(dp, ns, curr_i, curr_i + 1, res + 1);
  } else if (ns[curr_i] <= ns[prev_i]) {
    out_1 = res;
  }

  // !take
  let out_2 = 0;
  out_2 = recur(dp, ns, prev_i, curr_i + 1, res);

  const max = Math.max(out_1, out_2);
  dp[prev_i + 1][curr_i + 1] = max;
  return max;
};

var lengthOfLIS = function (ns) {
  if (ns.length === 1) return 1;

  const dp = Array(ns.length + 1)
    .fill(undefined)
    .map((_, i) => {
      return Array(ns.length + 1).fill(undefined);
    });

  const prev_i = -1;
  const curr_i = 0;
  const res = 0;
  return recur(dp, ns, prev_i, curr_i, res);
};

有人能指出我犯的任何错误吗?我正在尝试使用调试器来查看发生了什么。

【问题讨论】:

    标签: javascript algorithm


    【解决方案1】:

    您可以通过比较缓存结果与未缓存结果和日志记录差异来调试此类问题。

    问题是这个函数的结果取决于prev_i、curr_i和res的值。但是,您的缓存仅取决于 prev_i 和 curr_i 的值,因此没有足够的信息来预测正确的输出。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2016-09-30
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多