【代码随想录】刷题Day32

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

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

贪心的思路:只要前一个比后一个小就算利息,即便是连续上升也没有关系,因为每一次的差值都会在最后的累加中算进去。

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

2.跳跃游戏

55. 跳跃游戏

关键把握元素为0的条件

情况一:一个数组,数量等于1时,只有有一个元素,那么不需要考虑,因为全覆盖了。

情况二:一个数组,只要没有零,那就不存在false的情况,因为怎么走都能走

情况三:一个数组,除去最后一个元素,其他之中有0元素,那么此时就需要考虑会不会出现false的问题,其实很简单,如果一个位置上的数为0,那么数的前面位置都无法到达该位置的后面,也就是说前面位置的所有元素都小于当前位置和前面对应元素位置的差。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size()==1)
            return true;
        for(int i=nums.size()-2;i>=0;i--)
        {
            if(nums[i]==0)
            {
                if(i==0)
                    return false;
                else
                {
                    int falg=0;
                    for(int j=i-1;j>=0;j--)
                    {
                        if((i-j)<nums[j])
                            falg=1;
                    }
                    if(falg==0)
                        return false;
                }
            }
        }
        return true;
    }
};

覆盖范围

cover是用于记录当前位置可走过的最大范围

每向前走一次都要计算一次当前位置能走过的最大范围,随后和cover比较,并且如果大于cover则更新cover,那么每次循环的条件就是i小于等于cover的条件。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size()==1)
            return true;
        int cover = 0;
        for(int i=0;i<=cover;i++)
        {
            cover=(cover>=i+nums[i])?cover:i+nums[i];
            if(cover>=nums.size()-1)
                return true;
        }
        return false;
    }
};

3.跳跃游戏 II

45. 跳跃游戏 II

每一层的cover表示上次位置下,最多能向前走的范围

max_cover表示当前的最大向前范围

循环中,需要每次更新max_cover。如果i==cover,此时就是最大能跨越的范围,我们定义ret为跨越的次数,由于每次都是经可能范围大的向前,说明现在的条件就是最适合向前跨越的一次的时间,ret++,并且更新cover的值为max_cover的值

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灼榆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值