代码随想录刷题营| LeetCode 122-买卖股票的最佳时机II 55-跳跃游戏 45-跳跃游戏II

122 买卖股票的最佳时机II(medium)

只收正利润

注意数组越界

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

55 跳跃游戏(medium)

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=max(i+nums[i],cover);
        if(cover>=nums.size()-1) return true;
        
      }
      return false;
    }
};

 45 跳跃游戏II(medium)

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

一个简单的示例 [2, 3, 1, 1, 4] 来模拟这个过程:

初始状态:

  • curDistance = 0: 当前覆盖最远距离下标为 0
  • ans = 0: 记录走的最大步数为 0
  • nextDistance = 0: 下一步覆盖最远距离下标为 0

我们从第一个位置开始,即 nums[0],在位置 0,nums[0] 为 2,意味着我们可以跳到位置 1 或位置 2。

  • 我们选择跳到位置 1,nextDistance 更新为 max(2+0, 0) = 2
  • i 等于 curDistance(当前覆盖最远距离下标)时,意味着我们已经达到了当前所能跳到的最远距离,所以我们需要再走一步。
  • 我们更新 curDistancenextDistance,现在 curDistance 为 2,意味着我们现在处于位置 1 的时候可以跳到的最远距离。
  • 如果 nextDistance 大于等于数组的长度减 1,说明已经到达了数组的末尾,我们就不需要再走额外的步数了,可以直接结束。
  • 此时 ans 增加为 1,表示我们走了一步。

下一步:

  • 我们现在位于位置 1,可以选择跳到位置 2 或位置 3。这里选择跳到位置 3,nextDistance 更新为 max(1+3, 2) = 4
  • i 等于 curDistance 时,我们需要再走一步。更新 curDistancenextDistance,现在 curDistance 为 4,表示我们可以从位置 2 跳到的最远距离。
  • nextDistance 已经大于等于数组的长度减 1,所以直接结束。

最终结果为 ans = 2,表示到达数组末尾所需的最少跳跃次数为 2。

ps:leetcode规定一定可以跳到终点,只需要判断最小步数

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值