实现思路可以用动态规划思想:
以示例为例:设定一个数组表示跳到某个位置所需最少次数,
初始位置能跳跃的最大距离是2,那么是不是从初始位置0到1-2区间跳跃任意位置都只需一次就搞定,也就是dp[0]+1,那么1-2区间为起点跳跃时所能到达的最大位置是4,意味着跳到位置3-4区间所需最少次数等于前面区间最少次数+1即可:
列出动态方程:当前位置所在区间内所有位置所需最少次数=前一区间所需最少次数+1;
class Solution {
public:
int jump(vector<int>& nums) {
int remote=0+nums[0];
vector<int> dp(nums.size());
dp[0]=0;
for(int i=1;i<nums.size();i++){//i表示的是区间起始值,也代表了这个区间
if(remote>=nums.size()-1) remote=nums.size()-1;//超越最后一个位置的时候要防止越界
int dir=remote;
for(int j=i;j<=dir;j++){
dp[j]=dp[i-1]+1;
remote=max(remote,j+nums[j]);//
}
i=dir;//更新区间
}
return dp[nums.size()-1];
}
};
也可以使用贪心的思想正向查找:
设立区间终点位置end和当前区间能跳到的最远位置remote:i就是我们一直行走的过程,当走到当前区间边界的时候,我们就要更新下个区间的边界,同时要开始准备跳跃了,所以步数提前+1,接着进行跳跃到下个区间,在区间行走过程中只要不到达边界就无须跳跃步数无需增加,但是要实时更新下一次的能跳到的最远位置,确定下个区间。
注意:我们的步数是提前+1,所以无需跳到最后一个位置,只要remote大于等于最后一个位置,我们就一定能跳跃到。
class Solution {
public:
int jump(vector<int>& nums) {
int end=0,step=0,len=nums.size();
int remote=0;
for(int i=0;i<len-1;i++){
remote=max(remote,i+nums[i]);
if(end==i){
step++;
end=remote;
}
}
return step;
}
};