JavaScript LeetCode Diary 7

248 阅读1分钟

2020-04-16 (DP, Array)

昨晚宿醉,今天有点累。

刷点 easy 放松一下。

392. Is Subsequence

两个指针,一个在s上一个在t上。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function (s, t) {
  if (!s.length) return true;

  let indexS = 0;
  let indexT = 0;

  while (indexT < t.length) {
    if (s[indexS] === t[indexT]) {
      indexS += 1;
      if (indexS === s.length) {
        return true;
      }
    }
    indexT += 1;
  }
  return false;
};

509. Fibonacci Number

爬楼梯原题,没什么好说的。前几天有个百度的哥们来面试没写出来,被同事一阵吐槽。引以为戒。

/**
 * @param {number} N
 * @return {number}
 */
var fib = function (N) {
  if (N <= 1) return N;
  let pre = 0;
  let lat = 1;
  let fibo = 0;

  while (N >= 2) {
    fibo = pre + lat;
    pre = lat;
    lat = fibo;
    N -= 1;
  }

  return fibo;
};

1137. N-th Tribonacci Number

与上一题类似,提交之后整理 github 时才发现我之前做过了。去年的解法做了 memoization。哎,现在写代码,只追求完成,需要警醒。

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci1 = function (n) {
  const memoization = {};
  for (let i = 0; i <= n; i++) {
    if (i === 0 || i === 1) {
      memoization[i] = i;
      continue;
    }
    if (i === 2) {
      memoization[i] = 1;
      continue;
    }
    memoization[i] = memoization[i - 3] + memoization[i - 2] + memoization[i - 1];
  }
  return memoization[n.toString()];
};

/**
 * @param {number} n
 * @return {number}
 */
var tribonacci2 = function (n) {
  if (n <= 1) return n;
  if (n === 2) return 1;

  let pre = 0;
  let mid = 1;
  let lat = 1;
  let tribo = 0;

  while (n >= 3) {
    tribo = pre + mid + lat;
    pre = mid;
    mid = lat;
    lat = tribo;
    n -= 1;
  }

  return tribo;
};

303. Range Sum Query - Immutable

刷过了二维数组的 dp 之后面对现在这种一维的,基本上一遍过。

corner case 还是要注意。

/**
 * @param {number[]} nums
 */
var NumArray = function (nums) {
  const dp = nums.slice();
  for (let i = 1; i < nums.length; i++) {
    dp[i] = nums[i] + dp[i - 1];
  }
  this.dp = dp;
};

/**
* @param {number} i
* @param {number} j
* @return {number}
*/
NumArray.prototype.sumRange = function (i, j) {
  const { dp } = this;
  return i === 0 ? dp[j] : dp[j] - dp[i - 1];
};

/**
* Your NumArray object will be instantiated and called as such:
* var obj = new NumArray(nums)
* var param_1 = obj.sumRange(i,j)
*/