Day35~122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II

103 阅读2分钟

摘要

本文主要介绍了LeetCode贪心算法的几个题目,包括122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II。

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

1.1 思路

  • 局部最优:收集每天正的利润
  • 全局最优:求得最大利润
  • 贪心算法的关键思想是,只要有利可图,就进行买入和卖出操作,从而累积最大的利润。这种方法适用于多次买卖的情况,因为它允许在同一天卖出并买入。

1.2 代码

    public int maxProfit(int[] prices) {
        int result = 0;
        for(int i=1; i<prices.length; i++) {
            result += Math.max(prices[i]-prices[i-1], 0);
        }
        return result;
    }

2、55. 跳跃游戏

2.1 思路

  • 局部最优:每次取最大跳跃步数(取最大覆盖范围)
  • 整体最优:最后得到整体最大覆盖范围,看是否能到终点
  • 这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。

2.2 代码

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

3、45.跳跃游戏 II

3.1 思路

  • 每一步尽可能地用最少的步数去增加我的覆盖范围,一旦我的覆盖范围覆盖到了终点,就把我们的这个步数输出即可

3.2 代码

    public int jump(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return 0;
        }
​
        //记录跳跃的次数
        int count=0;
        //当前的覆盖最大区域
        int curDistance = 0;
        //最大的覆盖区域
        int maxDistance = 0;
​
        for(int i=0; i<nums.length; i++) {
            //在可覆盖区域内更新最大的覆盖区域
            maxDistance = Math.max(i+nums[i], maxDistance);
​
            // 走到当前覆盖的最大区域时,更新下一步可达的最大区域
            if(i == curDistance) {
                curDistance = maxDistance;
                count++;
            }
​
            // 说明当前一步,就到达了末尾
            if(curDistance >= nums.length-1) {
                break;
            }
        }
        return count;
    }

参考资料

代码随想录-122.买卖股票的最佳时机 II

代码随想录-55. 跳跃游戏

代码随想录-45.跳跃游戏 II