算法练习day28

68 阅读1分钟

一、买卖股票的最佳时机2

局部最优:收集每天的正利润

全局最优:求得最大利润

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let ans = 0
    for(let i = 1; i < prices.length;i++) {
        ans += Math.max(0, prices[i] - prices[i-1])
    }
    return ans
};

二、跳跃游戏

局部最优:每次取最大跳跃步数

整体最优:最后得到整体最大覆盖范围,能否覆盖终点

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    let cover = 0
    // 注意这里是cover
    for(let i = 0; i <= cover; i++) {
        cover = Math.max(cover, nums[i] + i)
        if(cover >= nums.length - 1) {
            return true
        }
    }
    return false
};

三、跳跃游戏2

统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果到了移动位置等于最大覆盖且没有到达终点,必须再走一步来增加覆盖范围

对于索引到达最远覆盖距离,如果是集合终点,不需要加1,不是的话,继续加1,这个可以通过i < nums.length - 1简化,当下标指向nums.length - 2,在走一步,肯定可以到达终点,否则,已经覆盖到终点了

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function(nums) {
    let curDistance = 0
    let nextDistance = 0
    let ans = 0
    for(let i = 0; i < nums.length - 1; i++) {
        nextDistance = Math.max(nums[i] + i, nextDistance)
        if(i === curDistance) {
            curDistance = nextDistance
            ans++
        }
    }
    return ans
};