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;
};