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

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跳跃游戏--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;
}   
};

以上是关于跳跃游戏--DP和贪心策略的主要内容,如果未能解决你的问题,请参考以下文章

LeetCodeLeetCode之跳跃游戏——动态规划+贪心算法

贪心——力扣55.跳跃游戏&&力扣45.跳跃游戏Ⅱ

LeetCode题解:跳跃游戏II

(贪心算法)Java 求解跳跃游戏 II

(贪心算法)Java 求解跳跃游戏

Leetcode55. 跳跃游戏(JAVA贪心)