给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [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;
}