代码随想录算法训练营第三二天 | 买卖股票、跳跃游戏

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

买卖股票的最佳时机II

只有一只股票!

当前只有买股票或者卖股票的操作。

最终利润是可以分解的:把利润分解为每天为单位的维度。

根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

在这里插入图片描述
其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。

那么只收集正利润就是贪心所贪的地方!

局部最优:收集每天的正利润,全局最优:求得最大利润。

class Solution {
   
    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;
    }
}

跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

跳几步无所谓,宗旨是 跳跃覆盖范围究竟可不可以覆盖到终点!

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

在这里插入图片描述
i 的移动范围: max cover + i
判断 max cover >= nums.length - 1 ? 直接 return true;

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

这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。

跳跃游戏ii

本题要计算最少步数。

局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。

但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。

真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

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

在这里插入图片描述
图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!

移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

class Solution {
   
    public int jump(int[] nums) {
   
        int curCover = 0;
        int nextCover = 0;
        int result = 0;
        if (nums.length == 1) return 0;
        for (int i = 0; i < nums.length; i++) {
   
            nextCover = Math.max(nextCover, i + nums[i]);// 更新下一步覆盖最远距离下标
            if (i == curCover) {
    // 遇到当前覆盖最远距离下标
                result++;
                curCover = nextCover;  //更新当前覆盖最远距离下标
                if (nextCover >= nums.length - 1) break;
            }
        }
        return result;
    }
}

理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-16 10:30:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-16 10:30:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-16 10:30:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-16 10:30:03       20 阅读

热门阅读

  1. Spring boot整合redisson报错

    2024-02-16 10:30:03       32 阅读
  2. idea基础配置

    2024-02-16 10:30:03       39 阅读
  3. ArrayList 与 LinkedList 区别

    2024-02-16 10:30:03       32 阅读
  4. Rust 原生类型

    2024-02-16 10:30:03       31 阅读
  5. SP1:基于Plonky3构建的zkVM

    2024-02-16 10:30:03       37 阅读
  6. 软件设计原则

    2024-02-16 10:30:03       26 阅读
  7. uniapp中打开蓝牙需要哪些权限

    2024-02-16 10:30:03       28 阅读
  8. STM32 I2C

    STM32 I2C

    2024-02-16 10:30:03      31 阅读
  9. Spring Boot开启SSL/Https进行交互。

    2024-02-16 10:30:03       28 阅读
  10. LeetCode474. Ones and Zeroes——动态规划

    2024-02-16 10:30:03       34 阅读