LeetCode:45 跳跃游戏 动态规划解法(最后一个样例时间超限)

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:
假设你总是可以到达数组的最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

一眼看上去很像DP,DP确实可以做,但是DP最后一个样例会超时
这里就是记一下思路听个响 ,之后会有更好的优化

状态定义:
dp[i] 表示从 i 下标的点到终点的最短跳跃距离

状态转移:

  • 当前点到终点的最短跳跃距离,就是在【当前点能够到达的所有点】里面选一个到终点距离最短的点,然后 + 1
  • dp[i] = min(dp[i+j]) + 1 ,j 范围 [1, nums[i] ],即从 1 到 i 点的最大跳跃距离

代码

在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums)
    {
        #define inf 1145141919
        int len = nums.size();
        if(len == 1)
        {
            return 0;
        }
        
        int* dp = new int[len];
        for(int i=0; i<len; i++)
        {
            dp[i] = -1;
        }
        
        // 初始化 终点到终点不用走
        // 如果倒数第二点能到终点,走一步就好
        dp[len-1] = 0;
        if(nums[len-2] >= 1)
        {
            dp[len-2] = 1;
        }
	
		// DP
        for(int i=len-3; i>=0; i--)
        {
            int min = inf;
            int res;
            for(int j=1; j<=nums[i]; j++)
            {
                if(j+i<len && dp[j+i]!=-1)
                {
                    res= dp[j+i] + 1;
                    if(res < min)
                    {
                        min = res;
                    }
                }
            }

            if(min < inf)
            {
               dp[i] = min; 
            }
        }

        return dp[0];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值