跳跃游戏--DP和贪心策略

题目:

在这里插入图片描述

dp解法

  1. dp定义:dp[i]表示在该下标处最多往前跳多少次
  2. 选择:<1>.跳到该i处后得到新的跳跃次数。<2>.如果新得到的跳跃次数还不如之前的跳跃次数-1那么不更新.
  3. dp关系:dp[i] = max(dp[i-1]-1,nums[i]),而且更新的前提是dp[i-1]-1大于等于0,要不然到不了dp[i]处.
  4. base case:dp[0] = nums[0].

代码

class Solution {
public:
   bool canJump(vector<int>& nums) {
       if(nums.size()==1)
        return true;
	int dp[nums.size()];
    memset(dp,0,sizeof(dp));
    dp[0] = nums[0];
	for (int i = 0; i < nums.size(); i++){
		if(i>0&&dp[i-1]>0){
            dp[i] = max(dp[i-1]-1,nums[i]);
        }
        //如果当前位置+当前最大往前距离>=最后的下标,则可以返回true,并且不能是最后一个下标的情况
        if(i!=nums.size()-1&&dp[i]+i>=nums.size()-1)
            return true;
	}
	return false;
}
};

贪心策略

不断更新最大能到达的下标处,如果大于等于了最后的下标值,则返回true。

class Solution {
public:
//贪心策略:选择跳与不跳到该格子的理由是,一旦跳到该格子后,可以跳的距离变得更加远,则更新最远跳跃距离,否则不更
//举例子:示例一中,我们开始只能往前跳两步到达下标为2的位置,而如果第一次跳一步,到达3,则可以最多跳到1+3的下标位置,故此时更新,再判断到nums[2]的位置后能跳的范围是不是更大,显然不会,所以最大范围maxFar不更新,如果跳到nums[3]与当前位置的跳跃范围相等,故不更新,实际上到了nums[1]的时候就已经得到了答案,因为i(跳到此处用了多少步)+nums[i]表示最多到达下标1+3 = 4为nums最后一个下标,故已经得到答案。
    bool canJump(vector<int>& nums) {
        if(nums.size()==1)
            return true;
        int  maxFar = nums[0];
        for(int i=1;i<nums.size();i++){
            //判断是否可以跳到该下标位置i,如果可以看是否需要更新maxFar
            if(maxFar>=i){
                maxFar = max(maxFar,i+nums[i]);
            }
            //如果更新到的范围已经超过或者等于最后一个下标,则返回true
            if(maxFar>=nums.size()-1)
                return true;
        }
        return false;
}   
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值