✅✅代码随想录算法训练营Day32 || 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

144 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情🚀🚀

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

image.png

代码实现

var maxProfit = function(prices) {
    let diff = 0;
    let res = 0;
    for(let i = 0; i < prices.length ; i++){
            diff = prices[i] - prices[i-1];
            if(diff > 0 ){
                res = diff + res;
            }
    }
    return res
};

这里的思路还是很简单的,只要收集两天之间的正收益就OK了~

55. 跳跃游戏 - 力扣(LeetCode)

image.png

代码实现

var canJump = function(nums) {  
    let cover = 0;
    for(let i = 0; i <= cover ; i++ ){
        cover = Math.max(cover,i+nums[i]);
        if(cover >= nums.length-1)
            return true
    }
    return false;
};

收获

  • 寻找最大值,可以直接用函数库Math.max
  • 贪心体现在哪?

    贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

45. 跳跃游戏 II - 力扣(LeetCode)

image.png

代码实现

var jump = function(nums) {
    let curIndex = 0
    let nextIndex = 0
    let steps = 0
    for(let i = 0; i < nums.length - 1; i++) {
        nextIndex = Math.max(nums[i] + i, nextIndex)
        if(i === curIndex) {
            curIndex = nextIndex
            steps++
        }
    }

    return steps
};

难点

  • 大概思路
    1. 维护当前能够到达的最大下标位置,记为边界,从左到右遍历数组,到达边界时,更新边界
    2. 在遍历数组时,不访问最后一个元素,因为终点必到达,如果访问最后一个元素,在边界正好为最后一个位置的情况下,会增加一次不必要的跳跃次数
  • 遍历的长度为整个数组,和上一题不一样。
  • 最后一次不需要遍历
  • 到达边界的时候再递增