代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

59 阅读1分钟

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

题目链接:122. 买卖股票的最佳时机 II

思路:题目中利润是可以分解的

加入第0天买入,第三天卖出,利润为price[3] - price[0]。其利润可以分解成(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。

image.png 使用贪心算法收集所有的正利润,最终结果就是最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length == 1) return 0;
        int count = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] > prices[i - 1]) count += prices[i] - prices[i - 1];
        }
        return count;
    }
}

55. 跳跃游戏

题目链接:55. 跳跃游戏

思路:可以将问题转化为跳跃的最大覆盖范围能不能够覆盖到终点。局部最优解就是每一步的最大覆盖范围,整体最优解就是最大覆盖范围能否到终点。

image.png

class Solution {
    public boolean canJump(int[] nums) { // 叠加覆盖范围
        int cover = 0;
        for (int i = 0; i <= cover; i++) {
            cover = Math.max(cover, i + nums[i]);
            if (cover >= nums.length - 1) return true;
        }
        return false;
    }
}

45.跳跃游戏II

题目链接:45. 跳跃游戏 II

思路:同样要看最大覆盖范围,但是要记录下一步覆盖的最远距离坐标,如果下标到达了当前的最大覆盖距离,仍然没有到达终点,那么就要加一步,开始下一步的最大覆盖距离。

image.png

class Solution {
    public int jump(int[] nums) {
        int cover = 0; // 当前最大覆盖范围
        int nextCover = 0; // 下一步最大覆盖范围
        int count = 0; // 结果
        if (nums.length == 1) return count;
        for (int i = 0; i <= cover && cover < nums.length - 1; i++) {
            nextCover = Math.max(nextCover, i + nums[i]); // 更新下一步最大覆盖范围
            if (i == cover) { // 走到当前最大覆盖距离,增加一步,更新最大覆盖范围
                cover = nextCover;
                count++;
            }
        }
        return count;
    }
}