是否有使用C编程的Jump Game问题的最佳解决方案

问题描述 投票:0回答:1

问题描述 给你一个整数数组。您最初位于数组的第一个索引处,数组中的每个元素代表您在该位置的最大跳跃长度。

如果可以到达最后一个索引,则返回 true,否则返回 false。

示例1:

输入:数组 = [2,3,1,1,4] 输出:真 解释:从索引 0 跳 1 步到 1,然后跳 3 步到最后一个索引。 示例2:

输入:数组 = [3,2,1,0,4] 输出:假 说明:无论如何,你总是会到达索引 3。它的最大跳转长度为0,这使得无法到达最后一个索引。

问题 (链接:https://leetcode.com/problems/jump-game/) 我使用递归来解决这个问题,但这会花费更多时间。那么,有什么方法可以用任何其他逻辑在 C 编程中有效地解决这个问题。 我的节目

bool isValid(int i,int* arr, int n, int* dp){
    if(i==n-1)return true;
    else if(i>=n)return false;
    else if(dp[i]!=-1)return dp[i]==1?true:false;

    for(int jump=1;jump<=arr[i];jump++){
        if(isValid(i+jump, arr, n,dp)){
            dp[i]=1;
            return true;
        }
    }
    return dp[i]=0;
}

bool canJump(int* nums, int numsSize) {
    int* dp = (int*)malloc(sizeof(int)*numsSize);
    for(int i=0;i<numsSize;i++)dp[i]=-1;
    return isValid(0, nums, numsSize, dp);
}

我使用递归来解决这个问题,但这会花费更多时间。那么,有什么方法可以用任何其他逻辑在 C 编程中有效地解决这个问题。

arrays c recursion dynamic-programming
1个回答
0
投票

由于你只能向前跳跃,所以这可以非常有效地完成。

遍历数组一次。如果当前索引大于最大可达索引,则返回 false。如果到达数组末尾,则返回 true。

最大可达索引是你遇到的元素的可达索引的最大值。元素的可达索引是其索引加上其值。

索引 0 1 2 3 4
好吗? 是(1≤2) 是(2≤4) 是(3≤4) 是(4≤4)
价值 2 3 1 1 4
可达索引 2 4 3 4 8
最大可达索引 2 4 4 4 8
索引 0 1 2 3 4
好吗? 是(1≤3) 是(2≤3) 是(3≤3) 没有(4>3)
价值 3 2 1 0 4
可达索引 3 3 3 3
最大可达索引 3 3 3 3
© www.soinside.com 2019 - 2024. All rights reserved.