Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
Example:
Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
Jump 1 step from index 0 to 1, then 3 steps to the last index.
Note:
You can assume that you can always reach the last index.
使用动态规划:从前向后 TEL
dp[0] = 0
dp[1] = dp[0] + 1;
dp[2] = min( dp[1] >=(2 - 1) ? dp[1] + 1 : n+1, dp[0] >= (2 - 0) ? dp[0] + 1: n + 1 )
dp[3] = min( dp[2] >= (3 - 2) ? dp[2] + 1 : n +1, dp[1] >= (3 - 1) ? dp[1] + 1: n + 1 , dp[0] >= (3 - 0) ? dp[0] + 1: n + 1)
dp[4] = min( dp[3] >= (4 - 3)? dp[3] + 1: n + 1, dp[2] >= (4 - 2) ? dp[2] + 1 : n + 1 , dp[1] >= (4 - 1) ? dp[1] + 1 : n + 1,
dp[0] >= (4 - 0 ) ? dp[4] + 1 : n + 1)
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n,n+1);
dp[0] = 0;
for(int i = 1; i < n ; i++)
{
int k = i - 1;
while(k >= 0)
{
if(nums[k] >= (i - k))
{
dp[i] = min(dp[i],(dp[k] + 1));
}
k--;
}
}
return dp[n - 1];
}
};
另一种动态规划算法:
计算出 位置 i ,所有可能到达的位置,并计算出步数
dp[0] = 0
i = 0,nums[0] = 2
j = 1 从0处跳1步: dp[1] = min(n + 1,dp[0] + 1) = 1
j = 2 从0处跳2步: dp[2] = min(n + 1,dp[0] + 1) = 1
i = 1, nums[1] = 3
j = 1 从1处跳1步: dp[2] = min(dp[2] , dp[1] + 1) = 1
j = 2 从1处跳2步: dp[3] = min(dp[3], dp[2] + 1) = 2
j = 3 从1处跳3步: dp[4] = min(dp[4], dp[1] + 1) = 2
i = 2 nums[2] = 1 < nums[1] = 3
i = 3 nums[3] = 1
j = 1 从3处跳1步:dp[4] = min(dp[4],dp[3] + 1) = 2
i = 4 nums[4] = 4
j = 1 i + j = 5 == 5
因此,dp[4] = 2
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n,n+ 1);
dp[0] = 0;
for(int i = 0; i < n ; i++)
{
if(i > 0 && nums[i] < nums[i - 1])
continue;
for(int j = 1; j <= nums[i] && (i + j) < n; j++)
{
dp[i + j] = min(dp[i + j],dp[i] + 1);
}
}
return dp[n - 1];
}
};