【前端er每日算法】贪心3题-122/55跳跃游戏/45

87 阅读2分钟

题目一 122. 买卖股票的最佳时机 II

思路

每次把两数相减之后得正数的相加,最后得到的值就是最大的值。

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

题目二 55. 跳跃游戏

思路

不断计算能覆盖的最大区间,如果区间大于长度,返回true,这里要注意的是更新的限制是要在可以覆盖的范围的下标内更新。

var canJump = function(nums) {
    let maxScale = 0;
    let len = nums.length;
    for (let i = 0; i <= maxScale; i++) { // 是到maxScale
        if (i + nums[i] > maxScale) {
            maxScale = i + nums[i];
        }
        if (maxScale >= len - 1) {
            return true;
        }
    }
    return false;
};

var canJump = function(nums) {
    let max = 0;
    const len = nums.length;
    for (let i = 0; i < len; i++) {
        // 在可以作为起点的每一个点上不断更新最大值,如果超过长度,则返回true
        if (i <= max) {
            max = Math.max(max, i + nums[i]);
            if (max >= len - 1) {
                return true;
            }
        }
        
    }
    return false;
};

题目三 45. 跳跃游戏 II

方法1

从前向后遍历,记录当前覆盖的最大范围和下一个元素覆盖的最大范围,如果当前索引等于了最大覆盖范围,则步数+1

var jump = function(nums) {
    let cur = 0;
    let next = 0;
    let count = 0;
    for (let i = 0; i < nums.length - 1; i++) {
        next = Math.max(nums[i] + i, next);
        if (i === cur) {
            cur = next;
            count++;
        }
    }
    return count;
};

方法2

从后向前遍历,然后遍历当前位置之前的元素,是否能覆盖当前的最大距离,能的话,更新end,count++,这个是双层循环。性能不一定好。

var jump = function(nums) {
    let count = 0;
    let end = nums.length - 1;
    while (end > 0) {
        for (let j = 0; j < end; j++) {
            if (nums[j] + j >= end) {
                count++;
                end = j;
                break;
            } 
        }
    }
    return count;
};

总结

感觉这个贪心算法不简单啊,这个跳跃游戏就不太好想,想了也不好写出来,是自己的短板。难啊,怎么才能掌握好。