leetcode跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

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

1.动态规划超时

假设输入数组为num,用数组dp[i]表示到达第i个位置需要的最少步数则

$$dp[i] = \min\{dp[j]|0\leq j<i,num[i] + i \geq j\} + 1$$

C++实现

int min_jump(vector<int> num)
{
    int n = num.size();
    vector<int> dp(n, 0);
    dp[0] = 0;
    for(int i=1;i<n;i++)
    {
        int min_ = n;
        for(int j=0;j<i;j++)
            {
                if(dp[j] < min_ && num[j] + j >= i)
                    min_ = dp[j]
            }
        dp[i] = min_ + 1;
    }
    return dp[n - 1];
}

2.贪心

每一次跳到下一步能跳得最远的位置

C++实现

int min_jump(vector<int> num)
{
    int n = num.size();
    if(n<=1)
        return 0;
    for(int i=0;i<n;)
    {
        if(num[i] + i>=n - 1)
        {
            step++;
            break;
        }
        int max_jump = 0;
        int max_index;
        for(int j=i;j<=num[i] + i;j++)
        {
            if(num[j] + j > max_jump)
            {
                max_jump = num[j] + j;
                max_index = j;
            }
        }   
        i = max_index;
        step++;
    }
    return step;
}

猜你喜欢

转载自blog.csdn.net/Xafter0/article/details/82193161