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

文章介绍了代码随想录算法训练营中的三道题目——122.买卖股票的最佳时机II、55.跳跃游戏和45.跳跃游戏II的解题思路和代码实现。对于股票问题,采用正利润求和的方法找到最佳买卖时机;跳跃游戏中,通过分析覆盖范围来确定能否到达终点;跳跃游戏II中,寻找最小跳跃次数,不断更新最大覆盖范围。
摘要由CSDN通过智能技术生成

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

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

题目链接:122.买卖股票的最佳时机II,难度:中等
【实现代码】

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int result = 0;
        for (int i = 1; i < prices.size(); i++) {
            result += max(prices[i] - prices[i - 1], 0);
        }
        return result;
    }
};

【解题思路】

我的思路是在低谷买入,高峰处卖出,类似于376. 摆动序列的实现,这样也能AC,但是需要考虑的情况太多。
还是卡哥的思路简单,利润是可以分解的,只需要将所有正利润求和,就可以得到最终的利润。

55. 跳跃游戏

题目链接:55. 跳跃游戏,难度:中等
【实现代码】

//我的思路
class Solution {
public:
    bool canJump(vector<int>& nums) {        
        if (0 == nums[0] && nums.size() > 1) {
            return false;
        }
        bool result = true;
        for (int i = 1; i < nums.size() - 1; i++) {
            if (0 == nums[i]) {
                result = false;
                for (int j = i - 1; j >= 0; j--) {
                    if ((nums[j] - nums[i]) > (i - j)) {
                        result = true;
                        break;
                    }
                }
            }
            if (!result) {
                break;
            }
        }                
        return result;
    }
};
//卡哥的思路
class Solution {
public:
    bool canJump(vector<int>& nums) {        
        if (nums.size() == 1) {
            return true;
        }
        bool result = false;
        int cover = 0;
        for (int i = 0; i <= cover; i++) {
            cover = max(i + nums[i], cover);
            if (cover >= nums.size() - 1) {
                result = true;
                break;
            }
        }
        return result;
    }
};

【解题思路】

我的考虑是当数组中出现0时,当不能跳过这个0时,那么就不能跳跃到终点。好像是没有使用贪心的策略。
卡哥的思路是分析覆盖的范围,当跳跃覆盖的范围可以到达或者超过终点时,就可以跳跃到终点。需要实时更新最大的覆盖范围,当走到了最大覆盖范围时,但没有到达终点则失败。

45.跳跃游戏II

题目链接:45.跳跃游戏II,难度:中等
【实现代码】

class Solution {
public:
    int jump(vector<int>& nums) {
        int curCover = 0;
        int nextCover = 0;
        int result = 0;
        for (int i = 0; i < nums.size(); i++) {
            nextCover =  max(nums[i] + i, nextCover);
            if (i == curCover) {
                if (i != nums.size() - 1) {                    
                    result++;
                    curCover = nextCover;
                    if (curCover >= nums.size() -1) {
                        break;
                    }
                } else {
                    break;
                }
            }
        }
        return result;
    }
};

【解题思路】

本题目求最小的跳跃次数,因为题目中已经说明可以跳跃到终点,所以只需要统计最大覆盖范围超过终点时的步数。也就是说,在当前最大覆盖范围时找当前覆盖范围内下一个比当前范围大的最大范围,当下一个最大范围超过了终点时,就结束了。每次更新当前最大范围时相当于跳跃了一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值