JavaScript LeetCode Diary 6

316 阅读1分钟

2020-04-15 (DP)

今天要去喝酒,刷两题 easy。

53. Maximum Subarray

老题了,也是 dp 的思想,首先记录一个最大值,然后记录一个动态的累加值。[-2,1,-3,4,-1,2,1,-5,4]

如果 sum 加当前数,还不如当前数大,说明前面的数拖后腿了,直接用当前数重置。

如果 sum 加当前数更大了,说明找对了,继续向后。

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
  if (!nums.length) return 0;

  // max 是全局的最大值
  let max = nums[0];
  // sum 是遍历到当前的加和,累加
  let sum = nums[0];

  for (let i = 1; i < nums.length; i++) {
    sum = Math.max(nums[i], sum + nums[i]);
    max = Math.max(sum, max);
  }
  return max;
};

198. House Robber

指针需要在数组上跳跃。所以开始记录两个值,一个当前值,一个当前值和毗邻的最大值。

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function (nums) {
  if (!nums.length) return 0;
  if (nums.length <= 2) return Math.max.apply(null, nums);

  let start = nums[0];
  let max = Math.max(nums[0], nums[1]);

  for (let i = 2; i < nums.length; i++) {
    const tmp = max;
    max = Math.max(nums[i] + start, max);
    start = tmp;
  }
  return max;
};