• 代码随想第31天 | 122.买卖股票的最佳时机II 、 55. 跳跃游戏 、 45.跳跃游戏II


    一、前言

    参考文献:代码随想录

    今天主要还是贪心,但是是比较难想到的题目,不管那么多吧,直接做吧!

    二、买卖股票的最佳时机||

    1、思路:

    这个思路我确实想不出来,但是这个思路又异常的简单!

    只要比较第二天和第一天的股票差值是否大于0,如果大于0那就直接把差价加入到porfit当中去。

    就是这么简单的一个思路。。

    2、整体代码如下:

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int porfit = 0;
    5. for (int i = 1; i < prices.size(); i++) {
    6. if (prices[i] - prices[i - 1] > 0) {
    7. porfit += prices[i] - prices[i - 1];
    8. }
    9. }
    10. return porfit;
    11. }
    12. };

    三、跳跃游戏

    1、思路:

    我自己想的思路是:

    (1)遍历,数组,然后就不断跳最大值(就不断地贪),但是并不能通过所有的用例

    代码如下:

    1. class Solution {
    2. public:
    3. bool canJump(vector<int>& nums) {
    4. int temp = 0;
    5. int i = 0;
    6. if (nums.size() == 1) {
    7. return true;
    8. }
    9. while (i < nums.size() - 1) {
    10. temp = i;
    11. i += nums[i];
    12. if (i == temp) {
    13. return false;
    14. }
    15. }
    16. return true;
    17. }
    18. };

     

    这个用例通过不了,然后就一直缝缝补补,也过不去;

    然后我去问了一下GPT教授,他跟我说的思路是:

    (1)创建一个for循环,遍历数组nums,再创建一个farthest来记录当前nums中到达的最远距离

    (2)每次遍历之前,先检查这个farthest是小于i如果小于说明到达不了i就卡一直接返回false了。

    (3)如果最后出来的时候farthest大于等于nums.size()  - 1的话就可以返回true了。

    2、整体代码如下:

    1. class Solution {
    2. public:
    3. bool canJump(vector<int>& nums) {
    4. // 记录能jump的最远处
    5. int farthest = 0;
    6. for (int i = 0; i < nums.size(); i++) {
    7. // 比较是否能到达i
    8. if (i > farthest) {
    9. return false;
    10. }
    11. // 维护farthest
    12. farthest = max(farthest, i + nums[i]);
    13. }
    14. return farthest >= nums.size() - 1;
    15. }
    16. };

    四、跳跃游戏||

    1、思路:

    我自己想,真想不出来。

    看完卡哥的视频后,发现这个主要话是一个覆盖范围的问题:

    (1)首先需要定义好边界和最大覆盖范围

    (2)遍历所有nums,然后当i == end(边界)时,就可以进行下一步跳了,然后再划分覆盖最大的范围。

    (3)在此期间要更新最大的覆盖范围;

    2、整体代码如下:

    1. class Solution {
    2. public:
    3. int jump(vector<int>& nums) {
    4. // 跳的次数
    5. int result = 0;
    6. // 覆盖范围
    7. int end = 0;
    8. // 最大范围
    9. int next = 0;
    10. if (nums.size() == 1) {
    11. return result;
    12. }
    13. for (int i = 0; i < nums.size(); i++) {
    14. next = max(next, i +nums[i]);
    15. // 说明i到了覆盖范围了,说明需要跳一步了
    16. if (end == i) {
    17. // 判断一下有没有到达终点
    18. if (end < nums.size() - 1) {
    19. // 没有就要跳一步了
    20. result++;
    21. // 重新划分范围
    22. end = next;
    23. //再判断一下,有没有到达边界
    24. if (end >= nums.size() - 1) break;
    25. } else {
    26. break;
    27. }
    28. }
    29. }
    30. return result;
    31. }
    32. };

    五、复习:

     大概复习了一下螺旋矩阵和链表的题目,感觉有点记忆了。

    今日学习时间:2小时

    leave message:

    looking up, I find the moon bright; bowing, in homesickness I'm drowned.

    举头望明月,低头思故乡。

  • 相关阅读:
    洞悉消费者心理:群狼调研帮您制定成功策略
    CPP 获取数组元素个数的问题
    CS144 计算机网络 Lab1:Stream Reassembler
    C++数据结构与算法:布隆过滤器(Bloom Filter)原理与实现
    机器学习实战系列[一]:工业蒸汽量预测(最新版本上篇)含数据探索特征工程等
    详解数据结构-----栈
    day54 django中orm数据库增删改查
    【2023,学点儿新Java-52】变量与运算符&企业真题_含阿里巴巴、字节跳动等大厂:Java开发中 计算金额时使用什么数据类型?char型变量能否存储一个中文汉字?...
    【机器学习】重塑汽车设计与制造:实例与代码探索
    自己更换尾插的视频教程
  • 原文地址:https://blog.csdn.net/m0_73881890/article/details/137431692