Jump Game II
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.
For example:
Given array A = [2,3,1,1,4]
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.)
class Solution {
public:
//用动态规划 超时了
/*
int jump(vector<int>& nums) {
int len=nums.size();
int *dp=new int[len];
const int MAX=9999999;
dp[0]=0;
for(int i=1;i<len;i++)
dp[i]=MAX;
for(int i=1;i<len;i++)
{
for(int j=0;j<i;j++)
{
if(j+nums[j]>=i)
{
int tmp=dp[j]+1;
if(tmp<dp[i])
{
dp[i]=tmp;
break;
}
}
}
}
return dp[len-1];
}
//倒退也超时
int jump(vector<int>& nums) {
int n=nums.size();
int pre=0,last=n-1;
int sum=0;
while(1)
{
if(pre==last)
return 0;
pre=last;//两个节点保存当前位置,pre向前遍历寻找满足的,last保存当前位置
sum++;
for(int i=n-2;i>=0;i--)
{
if(i+nums[i]>=last)
{
if(pre>i)
pre=i;
}
}
if(pre==0)
return sum;
};
}
*/
/*参考别人的:
sum:目前为止的jump数
cur:从A[0]进行sum次jump之后达到的最大范围,当前能到达的最大的
curMax:从0~i这i+1个A元素中能达到的最大范围,就是当前该位置可以覆盖的最大范围
当cur<i,说明sum次jump已经不足以覆盖(>=)当前第i个元素,因此需要增加一次jump,使之达到记录的curMax。
A = [2,3,1,1,4]模拟即可
*/
int jump(vector<int>& nums) {
int cur=0,curMax=0,sum=0;
int n=nums.size();
for(int i=0;i<n;i++)
{
if(cur<i)
{
sum++;
cur=curMax;
}
curMax=max(curMax,i+nums[i]);
}
return sum;
}
};